原文转自: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;