2017-01-31 2 views
0

저는이 SQL 솔루션을 아무런 쓸모없는 것으로 생각하면서 오늘 6 시간 이상을 보냈습니다. 솔직히, 일부 검색 후에 PIVOT 명령 (이전에는 본적이 없음)을 사용하여 필자가 얻은 결과를 얻은 후 조인 명령과 함께 사용할 때이 명령을 파악하려고했습니다. 나는별로 똑똑하지 않다.조인과 피벗을 사용하는 SQL

을 나는 (내가 믿는 사람을 보여주는 미안 몇 가지 다른 INNER 다른 테이블이 참조하는 조인 이후이 질문에 대한 관련된)이 테이블을 가지고 :

는 미안 뭘하려는 것입니다

enter image description here


enter image description here


,536,913 63,210

enter image description here

그리고이 쿼리 : 최근에 그

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 배운 :

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 

내가이을 반환하려면이 반환

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 

PIVOT을 사용하여이 작업을 수행 할 수는 있지만 어떻게 작동하는지 완전히 알 수 없습니다. 내 쿼리에있는 것과 같은 여러 INNER JOIN 명령과 함께 사용하십시오. 여러 가지 방법으로 시도했지만 항상 오류가 발생합니다.

아무도 내가 비슷한 쿼리를 사용한 후 어떻게 달성 할 수 있는지에 대한 예제를 줄 수 있습니까?

나는 보드를 검색했는데 발견 한 모든 예제가 너무 복잡하거나 내 쿼리와 비교할 때 단순한 방법이었다. 나는 게으른 것이 아니며 이것을 배우기위한 최선의 노력을 기꺼이 감수하고 있습니다 만, 지금은 도달 할 수없는 것 같습니다. 누군가가 여기에 몇 가지 빛이 더 낫다고 매우 감사,

감사합니다 다니엘을 흘릴 수 있다면 당신이 모든에 의해 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

나는, 각 [Easytool_data].[dbo].[estoque].[id]에 의해 첫 번째 하위 쿼리의 반환을 하나 개의 행을 가정 하위 쿼리의 필드입니다.

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 개 더 – McNets

1

당신이 fullselect에, 나는 위의 쿼리에 의해 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

두 번째 답변을 게시 할 것입니다. 이것이 제가 처음부터 해왔 던 것입니다. 잠시만 기다려주십시오 ... – marcothesane

관련 문제