2017-01-31 27 views
0

今日、6時間以上を費やして、このSQLソリューションを無駄にしないようにしました。正直なところ、私はPIVOT命令を使用しなければならないということをいくつかの検索の後に分かりました(私はそれを前に見たことがありませんでした)、その後私はこのコマンドを結合コマンドで使用すると分かります。私はそれほどスマートではありません。ジョインとピボットを使用したSQL

これは - 私がやろうとするものである:

私はこれらのテーブル( - 私は、私はいくつかの他のINNERが他のテーブルを参照するがJOINSので、この質問のために関連していると考えているものを示す)を持っている:

enter image description here


enter image description here


enter image description here

そして、このクエリ:これを返す

SELECT [Easytool_data].[dbo].[estoque].[id] AS ID 
     ,[Easytool_data].[dbo].[estoque].[barras] AS PartNumber 
     ,[Easytool_data].[dbo].[estoque].[codigo] AS Codigo 
     ,[Easytool_data].[dbo].[estoque].[descricao] AS Descricao 
     ,[Easytool_data].[dbo].[estoque].[um] AS Unidade 
     ,[Easytool_data].[dbo].[familias].[Descricao] AS Familia 
     ,[Easytool_data].[dbo].[estoque].[fabricante] AS Fabricante 
     ,[Easytool_data].[dbo].[estoque].[modelo] AS Modelo 
     ,[Easytool_data].[dbo].[estoque].[armazenagem] AS Local 
     ,[Easytool_data].[dbo].[status].[Descricao] AS Situacao 
     ,[Easytool_data].[dbo].[estoque].[custo] AS Preco 
     ,[Easytool_data].[dbo].[estoque].[sd_atual] AS Saldo 
     ,[Easytool_data].[dbo].[local_estoque].[descricao] AS Estoque 
     ,[Easytool_data].[dbo].[local_estocado].[quantidade] AS Quantidade 

FROM [Easytool_data].[dbo].[estoque] 

INNER JOIN [Easytool_data].[dbo].[familias]  
ON [Easytool_data].[dbo].[estoque].[id_familia] = [Easytool_data].[dbo].[familias].[Id] 
INNER JOIN [Easytool_data].[dbo].[status] 
ON [Easytool_data].[dbo].[estoque].[id_status] = [Easytool_data].[dbo].[status].[Id] 
INNER JOIN [Easytool_data].[dbo].[local_estocado] 
ON [Easytool_data].[dbo].[estoque].[id] = [Easytool_data].[dbo].[local_estocado].[id_estoque] 
INNER JOIN [Easytool_data].[dbo].[local_estoque] 
ON [Easytool_data].[dbo].[local_estocado].[id_local_estoque] = [Easytool_data].[dbo].[local_estoque].[id] 

WHERE [Easytool_data].[dbo].[estoque].[id] = 3954 

ID  | PartNumber | Codigo | Descricao | Unidade | Familia | Fabricante | Modelo | Local  | Situacao | Preco | Saldo | Estoque  | Quantidade 
---------------------------------------------------------------------------------------------------------------------------------------------------- 
3954 | OSPÇ0024 | OSPÇ0024 | PINÇA ER 25 | UNIDADE | PINÇA  | SANDVIK | NULL | PI 01-D-2 | ATIVO | 25 | 2  | CENTRAL  | 1 
---------------------------------------------------------------------------------------------------------------------------------------------------- 
3954 | OSPÇ0024 | OSPÇ0024 | PINÇA ER 25 | UNIDADE | PINÇA  | SANDVIK | NULL | PI 01-D-2 | ATIVO | 25 | 2  | ROTATIVO 0 | 0 
---------------------------------------------------------------------------------------------------------------------------------------------------- 
3954 | OSPÇ0024 | OSPÇ0024 | PINÇA ER 25 | UNIDADE | PINÇA  | SANDVIK | NULL | PI 01-D-2 | ATIVO | 25 | 2  | REFORMA 0 | 0 
---------------------------------------------------------------------------------------------------------------------------------------------------- 
3954 | OSPÇ0024 | OSPÇ0024 | PINÇA ER 25 | UNIDADE | PINÇA  | SANDVIK | NULL | PI 01-D-2 | ATIVO | 25 | 2  | EMPRÉSTIMO | 1 

私はそれがこれを返すようにしたい:

ID  | PartNumber | Codigo | Descricao | Unidade | Familia | Fabricante | Modelo | Local  | Situacao | Preco | Saldo | Estoque | Quantidade | Estoque | Quantidade | Estoque | Quantidade | Estoque | Quantidade 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 
3954 |OSPÇ0024 | OSPÇ0024 | PINÇA ER 25 | UNIDADE | PINÇA  | SANDVIK | NULL | PI 01-D-2 | ATIVO | 25 | 2  | CENTRAL | 1   | ROTATIVO 0 | 0   | REFORMA 0 | 0   | EMPRÉSTIMO | 1 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 

I'veは非常に最近、学びましたこれを達成するためにPIVOTを使用することができますが、私は完全に失われています私の質問のようないくつかのINNER JOINコマンドでそれを使用してください。私はいくつかの異なる方法でそれを試して、常にエラーが発生します。

私のようなクエリを使用した後、私がどのように達成できるかについての例を誰にでも教えてもらえますか?

私はボードを検索しましたが、私が見つけたすべての例は、私のクエリと比較するにはあまりにも複雑すぎたり単純な方法でした。私は怠惰ではなく、私はこれを学ぶために私の最善の努力を尽くしても構わないが、今のところ手の届かないところにいるようだ。

誰かがI'dが

が、私は最初のサブクエリが唯一の各[Easytool_data].[dbo].[estoque].[id]で1行を返すと仮定し、そうでない場合は、あなたがすべてのBY GRUPしなければならないあなたに ダニエル

+0

PIVOTは、集計値 – McNets

+0

のために使用されています。この[Easytool_data]。[dbo]。[estoque] esto'は '[Easytool_data]。[dbo]。[estoque]。[id] AS ID'を' esto 'に変更することができます。id AS ID' – Edward

答えて

1

は、記述、以前の垂直列の使用について通常、 ; CASE式で使用するものと同じものを列名として使用します。同様 ので:あなたの構文がはるかに少ないだろう別名あなたがテーブルを使用する場合は

WITH initial_query_output (
    ID 
, PartNumber 
, Codigo 
, Descricao 
, Unidade 
, Familia 
, Fabricante 
, Modelo 
, Local 
, Situacao 
, Preco 
, Saldo 
, Estoque 
, Quantidade 
) AS (
      SELECT 3954,'OSPÇ002','OSPÇ00','PINÇA ER 2','UNIDAD','PINÇ','SANDVI','NUL','PI 01-D-','ATIV',25,2,'CENTRAL' ,1 
UNION ALL SELECT 3954,'OSPÇ002','OSPÇ00','PINÇA ER 2','UNIDAD','PINÇ','SANDVI','NUL','PI 01-D-','ATIV',25,2,'ROTATIVO 0' ,0 
UNION ALL SELECT 3954,'OSPÇ002','OSPÇ00','PINÇA ER 2','UNIDAD','PINÇ','SANDVI','NUL','PI 01-D-','ATIV',25,2,'REFORMA 0' ,0 
UNION ALL SELECT 3954,'OSPÇ002','OSPÇ00','PINÇA ER 2','UNIDAD','PINÇ','SANDVI','NUL','PI 01-D-','ATIV',25,2,'EMPRÉSTIMO' ,1 
) 
SELECT 
    ID 
, PartNumber 
, Codigo 
, Descricao 
, Unidade 
, Familia 
, Fabricante 
, Modelo 
, Local 
, Situacao 
, Preco 
, Saldo 
, SUM(CASE Estoque WHEN 'CENTRAL' THEN Quantidade END) AS "CENTRAL" 
, SUM(CASE Estoque WHEN 'ROTATIVO 0' THEN Quantidade END) AS "ROTATIVO 0" 
, SUM(CASE Estoque WHEN 'REFORMA 0' THEN Quantidade END) AS "REFORMA 0" 
, SUM(CASE Estoque WHEN 'EMPRÉSTIMO' THEN Quantidade END) AS "EMPRÉSTIMO" 
FROM initial_query_output 
GROUP BY 
    ID 
, PartNumber 
, Codigo 
, Descricao 
, Unidade 
, Familia 
, Fabricante 
, Modelo 
, Local 
, Situacao 
, Preco 
, Saldo 
; 

ID |PartNumber|Codigo|Descricao |Unidade|Familia|Fabricante|Modelo|Local |Situacao|Preco|Saldo|CENTRAL|ROTATIVO 0|REFORMA 0|EMPRÉSTIMO 
3,954|OSPÇ002 |OSPÇ00|PINÇA ER 2|UNIDAD |PINÇ |SANDVI |NUL |PI 01-D-|ATIV | 25| 2|  1|   0|   0|   1 
+0

これはさらに良いようです!ありがとうございました! –

0

ありがとう、非常に感謝して、ここでいくつかの光を当てることができればサブクエリのフィールド

WITH Cmd As 
(
    SELECT [Easytool_data].[dbo].[estoque].[id] AS ID 
      ,[Easytool_data].[dbo].[estoque].[barras] AS PartNumber 
      ,[Easytool_data].[dbo].[estoque].[codigo] AS Codigo 
      ,[Easytool_data].[dbo].[estoque].[descricao] AS Descricao 
      ,[Easytool_data].[dbo].[estoque].[um] AS Unidade 
      ,[Easytool_data].[dbo].[familias].[Descricao] AS Familia 
      ,[Easytool_data].[dbo].[estoque].[fabricante] AS Fabricante 
      ,[Easytool_data].[dbo].[estoque].[modelo] AS Modelo 
      ,[Easytool_data].[dbo].[estoque].[armazenagem] AS Local 
      ,[Easytool_data].[dbo].[status].[Descricao] AS Situacao 
      ,[Easytool_data].[dbo].[estoque].[custo] AS Preco 
      ,[Easytool_data].[dbo].[estoque].[sd_atual] AS Saldo 
    FROM [Easytool_data].[dbo].[estoque] 
    INNER JOIN [Easytool_data].[dbo].[familias]  
    ON [Easytool_data].[dbo].[estoque].[id_familia] = [Easytool_data].[dbo].[familias].[Id] 
    INNER JOIN [Easytool_data].[dbo].[status] 
    ON [Easytool_data].[dbo].[estoque].[id_status] = [Easytool_data].[dbo].[status].[Id] 
    WHERE [Easytool_data].[dbo].[estoque].[id] = 3954 
) 
SELECT ID, PartNumber, Codigo, Descricao, Unidade, Familia, Fabricante, Modelo 
     , Local, Situacao, Preco, Saldo, 
     CASE WHEN [Easytool_data].[dbo].[local_estoque].[descricao] = 'CENTRAL' 
      THEN [Easytool_data].[dbo].[local_estocado].[quantidade] 
      ELSE 0 END AS CENTRAL, 
     CASE WHEN [Easytool_data].[dbo].[local_estoque].[descricao] = 'ROTATIVO' 
      THEN [Easytool_data].[dbo].[local_estocado].[quantidade] 
      ELSE 0 END AS ROTATIVO, 
     CASE WHEN [Easytool_data].[dbo].[local_estoque].[descricao] = 'REFORMA' 
      THEN [Easytool_data].[dbo].[local_estocado].[quantidade] 
      ELSE 0 END AS REFORMA, 
     CASE WHEN [Easytool_data].[dbo].[local_estoque].[descricao] = 'EMPRÉSTIMO' 
      THEN [Easytool_data].[dbo].[local_estocado].[quantidade] 
      ELSE 0 END AS EMPReSTIMO 
FROM Cmd 
    INNER JOIN [Easytool_data].[dbo].[local_estoque] 
    ON Cmd.[id_local_estoque] = [Easytool_data].[dbo].[local_estoque].[id]; 
    INNER JOIN [Easytool_data].[dbo].[local_estocado] 
    ON [Easytool_data].[dbo].[local_estocado].[id_estoque] = Cmd.Id; 
+0

ありがとう@McNets - これらのエラーが発生しました:http://imgur.com/a/Gjde1 –

+0

今すぐお試しください。 。 l – McNets

+0

申し訳ありませんが、私はちょっと疲れました、cteクエリの3つのテーブル、2番目のサブクエリの2つ以上 – McNets

1

これはあなたが全選択を交換する場合、私は上記のクエリによってinitial_query_outputと呼ばれる共通テーブル式に動作するはずです:ちょうどSQLを使用して水平にピボット

WITH initial_query_output (
    ID 
, PartNumber 
, Codigo 
, Descricao 
, Unidade 
, Familia 
, Fabricante 
, Modelo 
, Local 
, Situacao 
, Preco 
, Saldo 
, Estoque 
, Quantidade 
) AS (
-- replace with your initial query from here 
      SELECT 3954,'OSPÇ002','OSPÇ00','PINÇA ER 2','UNIDAD','PINÇ','SANDVI','NUL','PI 01-D-','ATIV',25,2,'CENTRAL' ,1 
UNION ALL SELECT 3954,'OSPÇ002','OSPÇ00','PINÇA ER 2','UNIDAD','PINÇ','SANDVI','NUL','PI 01-D-','ATIV',25,2,'ROTATIVO 0' ,0 
UNION ALL SELECT 3954,'OSPÇ002','OSPÇ00','PINÇA ER 2','UNIDAD','PINÇ','SANDVI','NUL','PI 01-D-','ATIV',25,2,'REFORMA 0' ,0 
UNION ALL SELECT 3954,'OSPÇ002','OSPÇ00','PINÇA ER 2','UNIDAD','PINÇ','SANDVI','NUL','PI 01-D-','ATIV',25,2,'EMPRÉSTIMO' ,1 
-- replace with your initial query until here 
) 
SELECT 
    ID 
, PartNumber 
, Codigo 
, Descricao 
, Unidade 
, Familia 
, Fabricante 
, Modelo 
, Local 
, Situacao 
, Preco 
, Saldo 
, MAX(CASE Estoque WHEN 'CENTRAL' THEN Estoque END) AS Estoque1 
, MAX(CASE Estoque WHEN 'CENTRAL' THEN Quantidade END) AS Quantidade1 
, MAX(CASE Estoque WHEN 'ROTATIVO 0' THEN Estoque END) AS Estoque2 
, MAX(CASE Estoque WHEN 'ROTATIVO 0' THEN Quantidade END) AS Quantidade2 
, MAX(CASE Estoque WHEN 'REFORMA 0' THEN Estoque END) AS Estoque3 
, MAX(CASE Estoque WHEN 'REFORMA 0' THEN Quantidade END) AS Quantidade3 
, MAX(CASE Estoque WHEN 'EMPRÉSTIMO' THEN Estoque END) AS Estoque4 
, MAX(CASE Estoque WHEN 'EMPRÉSTIMO' THEN Quantidade END) AS Quantidade4 
FROM initial_query_output 
GROUP BY 
    ID 
, PartNumber 
, Codigo 
, Descricao 
, Unidade 
, Familia 
, Fabricante 
, Modelo 
, Local 
, Situacao 
, Preco 
, Saldo 

ID |PartNumber|Codigo|Descricao |Unidade|Familia|Fabricante|Modelo|Local |Situacao|Preco|Saldo|Estoque1|Quantidade1|Estoque2 |Quantidade2|Estoque3 |Quantidade3|Estoque4 |Quantidade4 
3,954|OSPÇ002 |OSPÇ00|PINÇA ER 2|UNIDAD |PINÇ |SANDVI |NUL |PI 01-D-|ATIV | 25| 2|CENTRAL |   1|ROTATIVO 0|   0|REFORMA 0|   0|EMPRÉSTIMO|   1 
+0

それは働いた!余分な列を削除して、 'CENTRAL'、 'REFORMA'という行の下に表示させるようにしてみましょう。まだできたら、試してみる価値があります! @marcothesaneありがとう –

+0

私は2番目の答えを投稿します。これは私が最初からやったことです。数秒待って... – marcothesane

関連する問題