一表:信息如下
月份, 商品, 单价, 金额, 仓库, 数量
1, 商品1, 100, 1000, 仓库1, 10
1, 商品1, 110, 2200, 仓库2, 20
1, 商品2, 100, 1000, 仓库1, 10
1, 商品2, 110, 3300, 仓库3, 30
.............
需要通过SQL语句得到下结构:
月份, 商品, 单价, 金额, 仓库1, 仓库2, 仓库3
1, 商品1, 105, 3200, 10, 20, 0
1, 商品2, 105, 4300, 10, 0, 30
仓库 是若干个,不止例子里的3个仓库,是要写成动态的
语句如下
CREATE TABLE info(月份 INT,商品 VARCHAR(10),单价 INT,金额 INT,仓库 VARCHAR(10),数量 INT)
INSERT info
SELECT 1, '商品1', 100, 1000, '仓库1', 10 UNION ALL
SELECT 1, '商品1', 110, 2200, '仓库2', 20 UNION ALL
SELECT 1, '商品2', 100, 1000, '仓库1', 10 UNION ALL
SELECT 1, '商品2', 110, 3300, '仓库3', 30
DECLARE @sql VARCHAR(MAX)
DECLARE @cangkuname VARCHAR(20)
DECLARE @i INT
DECLARE @j INT
SET @sql = 'select 月份,商品,avg(单价) as 单价,sum(金额) as 金额,'
SET @i = 1
SELECT @j = COUNT(DISTINCT 仓库)
FROM dbo.info
WHILE @i <= @j
BEGIN
SELECT @cangkuname = 仓库
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY 仓库 ) AS row ,
仓库
FROM ( SELECT DISTINCT
仓库
FROM dbo.info ) a ) b WHERE row = @i ;
SET @sql = @sql + @cangkuname + '=sum(case 仓库 when ''' + @cangkuname
+ ''' then 数量 else 0 end),';
SET @i = @i + 1
END
SET @sql = LEFT(@sql, LEN(@sql) - 1) + ' from dbo.info group by 月份,商品'
EXEC (@sql)