2015-01-30 11 views
5

, 내가 3 열이있는 테이블 (tblStock)가 아래 결과를 얻으시겠습니까?행과 열 총 SQL Server 2008의

PartCode WHs-A WHs-B WHs-C WHs-D WHs-E WHs-F Total 
........ ..... ..... ..... ...... ..... ..... ..... 
A   10  1  9  0  0  0  20 
B   22  0  0  0  0  0  22 
C   20  0  0  0  0  0  20 
D    2  0  0  0  0  39  41 
E    0  0  0  3  0  0  3 
F    7  0  0  0  54  0  61 
Total  61  1  9  3  54  39  167 

귀하의 도움에 감사드립니다.

답변

9

SAMPLE 표

SELECT * INTO #tblStock 
FROM 
(
SELECT 'A' PartCode, 10 StockQty, 'WHs-A' Location 
UNION ALL 
SELECT 'B', 22, 'WHs-A' 
UNION ALL 
SELECT 'A', 1, 'WHs-B' 
UNION ALL 
SELECT 'C', 20, 'WHs-A' 
UNION ALL 
SELECT 'D', 39, 'WHs-F' 
UNION ALL 
SELECT 'E', 3, 'WHs-D' 
UNION ALL 
SELECT 'F', 7, 'WHs-A' 
UNION ALL 
SELECT 'A', 9, 'WHs-C' 
UNION ALL 
SELECT 'D', 2, 'WHs-A' 
UNION ALL 
SELECT 'F', 54, 'WHs-E' 
)TAB 

동적 회전의 열을 얻고 당신은 행 및 열 합계 찾을 CUBE를 사용하여 NULL을 대체 할 수 zero

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + Location + ']', '[' + Location + ']') 
       FROM (SELECT DISTINCT Location FROM #tblStock) PV 
       ORDER BY Location 
-- Since we need Total in last column, we append it at last 
SELECT @cols += ',[Total]' 


--Varible to replace NULL with zero 
DECLARE @NulltoZeroCols NVARCHAR (MAX) 

SELECT @NullToZeroCols = SUBSTRING((SELECT ',ISNULL(['+Location+'],0) AS ['+Location+']' 
FROM (SELECT DISTINCT Location FROM #tblStock)TAB 
ORDER BY Location FOR XML PATH('')),2,8000) 

SELECT @NullToZeroCols += ',ISNULL([Total],0) AS [Total]' 

NULL 교체 생성 된 행에 대해 TotalCUBE. 당신이 원하는 경우 NULL 대신 0 :

결과

enter image description here

참고 결과

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT PartCode,' + @NulltoZeroCols + ' FROM 
      (
       SELECT 
       ISNULL(CAST(PartCode AS VARCHAR(30)),''Total'')PartCode, 
       SUM(StockQty)StockQty , 
       ISNULL(Location,''Total'')Location    
       FROM #tblStock 
       GROUP BY Location,PartCode 
       WITH CUBE 
      ) x 
      PIVOT 
      (
       MIN(StockQty) 
       FOR Location IN (' + @cols + ') 
      ) p 
      ORDER BY CASE WHEN (PartCode=''Total'') THEN 1 ELSE 0 END,PartCode' 

EXEC SP_EXECUTESQL @query 
  • Click here를 볼 수 있습니다

    1 만 표시

    • 코드 SELECT @cols += ',[Total]'SELECT @NullToZeroCols += ',ISNULL([Total],0) AS [Total]'를 사용하지 마십시오 요약 행 : 값으로는

      편집 동적 피벗 코드 @cols 대신 @NulltoZeroCols를 사용합니다.

    • CUBE 대신 ROLLUP을 사용하십시오.

    enter image description here

    2 만보기 열 총

    • 를 사용하여 코드 SELECT @cols += ',[Total]'SELECT @NullToZeroCols += ',ISNULL([Total],0) AS [Total]'.
    • CUBE 대신 ROLLUP을 사용하십시오.
    • GROUP BY Location,PartCode에서 GROUP BY PartCode,Location으로 변경하십시오.
    • ORDER BY CASE WHEN (PartCode=''Total'') THEN 1 ELSE 0 END,PartCode 대신 WHERE PartCode<>''TOTAL'' ORDER BY PartCode을 사용하십시오.

    enter image description here

    업데이트 : OP 나는 결과 PartName을 추가하려면 아래의 쿼리를 업데이트하고

    에 대한 PartName을 가지고. PartNameCUBE과 함께 추가 결과를 추가하고 AND 또는 OR 조건에 혼동을 피하려면 원본 테이블의 DISTINCT 값으로 피벗 된 결과에 참여하는 것이 좋습니다.

    • Click here
      DECLARE @query NVARCHAR(MAX) 
      SET @query = 'SELECT P.PartCode,T.PartName,' + @NulltoZeroCols + ' FROM 
            (    
             SELECT 
             ISNULL(CAST(PartCode AS VARCHAR(30)),''Total'')PartCode, 
             SUM(StockQty)StockQty , 
             ISNULL(Location,''Total'')Location    
             FROM #tblStock 
             GROUP BY Location,PartCode 
             WITH CUBE     
            ) x 
            PIVOT 
            (
             MIN(StockQty) 
             FOR Location IN (' + @cols + ') 
            ) p 
            LEFT JOIN 
            ( 
             SELECT DISTINCT PartCode,PartName 
             FROM #tblStock 
            )T 
            ON P.PartCode=T.PartCode 
            ORDER BY CASE WHEN (P.PartCode=''Total'') THEN 1 ELSE 0 END,P.PartCode' 
      
      EXEC SP_EXECUTESQL @query 
      

    enter image description here

+0

@Sokea를 업데이트했습니다. –

+0

정확히 무엇이 필요합니까? 솔루션 및 설명에 대해 @Sarath Avanavu에게 감사드립니다. – Sokea

+0

환영합니다 :) @Sokea –

1

당신이 total 행이 Location 값을 미리 알 수없는 경우 union

를 사용 얻으려면 데이터

를 피벗 case based aggregation를 사용해야합니다, 당신은 dynamic query

당신을 구성 할 필요가 또한 pivot 키워드를 사용하여 동일한 작업을 수행 할 수 있습니다.

select partCode, 
sum(case when Location='WHs-A' then StockQty 
     else 0 end 
    ) as 'Whs-A', 
sum(case when Location='WHs-B' then StockQty 
     else 0 end 
    ) as 'Whs-B', 
sum(StockQty) as 'Total' 
from tblStock 
group by partCode 
union all 
select 'Total' as 'partCode', 
sum(case when Location='WHs-A' then StockQty 
    else 0 end) as 'Whs-A', 
sum(case when Location='WHs-B' then StockQty 
    else 0 end) as 'Whs-B', 
sum(StockQty) as 'Total' 
from tblStock 
+1

덕분에 레이더를 결과를 볼 수 있습니다. 어쨌든 위치 알 수없는 열입니다, pls 수 있습니다. 동적 쿼리를 제공합니까? – Sokea