行列轉換(二)

原文轉自:http://topic.csdn.net/u/20090912/14/25d2e1b2-f352-4713-8618-d3433ba27bef.html


有一表
商品id 商品名稱 客戶名稱 日期 銷量
  1        a         張三     2009-1-1 1  
  1        a         李四     2009-1-5 2  
  2        b         王二     2009-1-5 3    
  2        b         李四     2009-1-5 5  
  3        c         王二     2009-1-1 6       
  1        a         張三     2009-2-1 8  
  1        a         張三     2009-2-2 2  

得到如下格式
一月 二月 合計
日期 a b c 小計 a b c 小計 a b c 小計
張三 1 1 10 10 11 11
李四 2 5 7 2 5 7
王二 3 6 9 3 6 9

累計 3 8 6 17 10 10 13 8 6 27


--靜態SQL

 

--> 生成測試數據: @tb

DECLARE @tb TABLE (商品id INT,商品名稱 VARCHAR(4),客戶名稱 VARCHAR(4),日期 DATETIME,銷量 INT)

INSERT INTO @tb

SELECT 1,'a','張三','2009-1-1',1 UNION ALL

SELECT 1,'a','李四','2009-1-5',2 UNION ALL

SELECT 2,'b','王二','2009-1-5',3 UNION ALL

SELECT 2,'b','李四','2009-1-5',5 UNION ALL

SELECT 3,'c','王二','2009-1-1',6 UNION ALL

SELECT 1,'a','張三','2009-2-1',8 UNION ALL

SELECT 1,'a','張三','2009-2-2',2

 

--SQL查詢如下:

 

SELECT ISNULL(客戶名稱,'累計') AS 客戶名稱,

SUM(CASE WHEN 商品名稱 = 'a'AND CONVERT(varchar(6),日期,112)='200901'

THEN 銷量 ELSE 0 END)AS [200901_a銷量],

SUM(CASE WHEN 商品名稱 = 'b'AND CONVERT(varchar(6),日期,112)='200901'

THEN 銷量 ELSE 0 END)AS [200901_b銷量],

SUM(CASE WHEN 商品名稱 = 'c'AND CONVERT(varchar(6),日期,112)='200901'

THEN 銷量 ELSE 0 END)AS [200901_c銷量],

SUM(CASE WHEN CONVERT(varchar(6),日期,112)='200901'

THEN 銷量 ELSE 0 END)AS [200901_累計銷量],

 

SUM(CASE WHEN 商品名稱 = 'a'AND CONVERT(varchar(6),日期,112)='200902'

THEN 銷量 ELSE 0 END)AS [200902_a銷量],

SUM(CASE WHEN 商品名稱 = 'b'AND CONVERT(varchar(6),日期,112)='200902'

THEN 銷量 ELSE 0 END)AS [200902_b銷量],

SUM(CASE WHEN 商品名稱 = 'c'AND CONVERT(varchar(6),日期,112)='200902'

THEN 銷量 ELSE 0 END)AS [200902_c銷量],

SUM(CASE WHEN CONVERT(varchar(6),日期,112)='200902'

THEN 銷量 ELSE 0 END)AS [200902_累計銷量],

 

SUM(CASE WHEN 商品名稱 = 'a'

THEN 銷量 ELSE 0 END)AS [a銷量],

SUM(CASE WHEN 商品名稱 = 'b'

THEN 銷量 ELSE 0 END)AS [b銷量],

SUM(CASE WHEN 商品名稱 = 'c'

THEN 銷量 ELSE 0 END)AS [b銷量],

SUM(銷量) AS [累計銷量]

FROM @tb

GROUP BY 客戶名稱 WITH ROLLUP


--動態SQL

 

--> 生成測試數據: @tb

CREATE TABLE tb(商品id INT,商品名稱 VARCHAR(4),客戶名稱 VARCHAR(4),日期 DATETIME,銷量 INT)

INSERT INTO tb

SELECT 1,'a','張三','2009-1-1',1 UNION ALL

SELECT 1,'a','李四','2009-1-5',2 UNION ALL

SELECT 2,'b','王二','2009-1-5',3 UNION ALL

SELECT 2,'b','李四','2009-1-5',5 UNION ALL

SELECT 3,'c','王二','2009-1-1',6 UNION ALL

SELECT 1,'a','張三','2009-2-1',8 UNION ALL

SELECT 1,'a','張三','2009-2-2',2

 

--SQL查詢如下:

 

DECLARE @sql varchar(8000);

SET @sql = '';

 

SELECT ID = IDENTITY(int,1,1),CONVERT(varchar(6),日期,112) AS 日期 INTO #tmp1

FROM tb GROUP BY CONVERT(varchar(6),日期,112);

 

SELECT DISTINCT 商品名稱 INTO #tmp2 FROMtb;

 

DECLARE @id int,@日期 varchar(6);

SET @id =(SELECT TOP 1 id FROM #tmp1 ORDER BY id);

WHILE @id IS NOT NULL

BEGIN

SET @日期 =(SELECT 日期 FROM #tmp1 WHEREID = @id);

 

SELECT @sql = @sql + ',SUM(CASE WHEN 商品名稱= ''' + 商品名稱

+ ''' AND CONVERT(varchar(6),日期,112)= ''' + @日期

+ ''' THEN 銷量ELSE 0 END) AS [' + @日期 + '_'

+ 商品名稱 + '銷量]'

FROM #tmp2

SET @sql = @sql + ',SUM(CASE WHEN CONVERT(varchar(6),日期,112)='''

+ @日期 + ''' THEN 銷量ELSE0 END) AS [' + @日期 + '_累計銷量]'

SET @id =(SELECT TOP 1 id FROM #tmp1 WHERE id > @id ORDER BY id);

END

 

SELECT @sql = @sql + ',SUM(CASE WHEN 商品名稱= ''' + 商品名稱

+ ''' THEN 銷量ELSE 0 END) AS [' + 商品名稱 + '銷量]'

FROM #tmp2;

 

EXEC('SELECT ISNULL(客戶名稱,''累計'')AS 客戶名稱'+@sql+',SUM(銷量) AS累計FROMtb

GROUP BY 客戶名稱WITH ROLLUP')

 

 

DROP TABLE #tmp1,#tmp2;

DROP TABLE tb;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章