簡體   English   中英

將數據行轉換為列並按月顯示

[英]Convert data row to column and show it month wise

我有一張桌子: -

CREATE TABLE #TmpData (
 RType Varchar(10),
 Client VARCHAR(10),
 TRequest INT,
 Due INT,
 Month INT
  );

  INSERT INTO #TmpData VALUES ('P', 'Name1',54,67,1),('P', 'Name5',5,47,1),('A', 'Name6',3,90,1 ),('A', 'Name3',4,43,1 ),('P', 'Name1',0,10,2)
  ,('P', 'Name2',1,78,2),('P', 'Name4',54,67,3),('P', 'Name3',5,47,3),('A', 'Name6',3,90,3 ),('P', 'Name8',3,233,3 ),('P', 'Name1',23,457,4)
  ,('P', 'Name7',3,6,4 ),('P', 'Name8',65,548,4 ),('P', 'Name2',3,56,5 ),('P', 'Name3',65,87,6 ),('P', 'Name4',3,56,7 ),('P', 'Name9',65,87,7 )

 SELECT * FROM #TmpData

我想將其數據行明智地轉換為列並按月顯示。 我附上了我需要的結果集的屏幕截圖。

結果集

例如,我已經服用了7個月,但最長可達12個月。

請幫忙。

謝謝

您可以嘗試使用帶有SUM函數的CASE WHEN

CASE WHEN比較month ,然后SUMTRequestDue group by
RTypeClient

SELECT RType,
       Client,
       SUM(CASE WHEN Month = 1 THEN TRequest ELSE 0 END) 'Jan Totle',
       SUM(CASE WHEN Month = 1 THEN Due ELSE 0 END) '#of Request',
       SUM(CASE WHEN Month = 2 THEN TRequest ELSE 0 END) 'Feb Totle',
       SUM(CASE WHEN Month = 2 THEN Due ELSE 0 END) '#of Request',
       SUM(CASE WHEN Month = 3 THEN TRequest ELSE 0 END) 'March Totle',
       SUM(CASE WHEN Month = 3 THEN Due ELSE 0 END) '#of Request',
       SUM(CASE WHEN Month = 4 THEN TRequest ELSE 0 END) 'April Totle',
       SUM(CASE WHEN Month = 4 THEN Due ELSE 0 END) '#of Request',
       SUM(CASE WHEN Month = 5 THEN TRequest ELSE 0 END) 'May Totle',
       SUM(CASE WHEN Month = 5 THEN Due ELSE 0 END) '#of Request',
       SUM(CASE WHEN Month = 6 THEN TRequest ELSE 0 END) 'June Totle',
       SUM(CASE WHEN Month = 6 THEN Due ELSE 0 END) '#of Request',
       SUM(CASE WHEN Month = 7 THEN TRequest ELSE 0 END) 'July Totle',
       SUM(CASE WHEN Month = 7 THEN Due ELSE 0 END) '#of Request',
       SUM(CASE WHEN Month = 8 THEN TRequest ELSE 0 END) 'Aug Totle',
       SUM(CASE WHEN Month = 8 THEN Due ELSE 0 END) '#of Request',
       SUM(CASE WHEN Month = 9 THEN TRequest ELSE 0 END) 'Sep Totle',
       SUM(CASE WHEN Month = 9 THEN Due ELSE 0 END) '#of Request',
       ....
FROM TmpData
GROUP BY RType,
       Client

sqlfiddle

編輯

如果要使month列動態,可以使用動態數據透視表。

DECLARE @cols AS NVARCHAR(MAX),
        @Pivotcols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);



SET @Pivotcols = STUFF((SELECT DISTINCT 
                                ',SUM(CASE WHEN Month = ' + CAST(Month AS VARCHAR(5)) + ' THEN TRequest ELSE 0 END) as ''' + FORMAT(DATEADD(mm,Month,'1900-01-01'),'MMM') + ' Totle ''',
                                ',SUM(CASE WHEN Month = ' + CAST(Month AS VARCHAR(5)) + ' THEN Due ELSE 0 END) as ''' + FORMAT(DATEADD(mm,Month,'1900-01-01'),'MMM') + ' Totle '''
            FROM TmpData 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'');


set @query = 'SELECT RType,Client, '+  @Pivotcols + ' FROM TmpData GROUP BY RType,Client'



execute(@query)

SQLFIDDLE動態數據透視

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM