经典的SQL语句,列是可变的动态行列转换,运用了循环的思想

一表:信息如下
月份, 商品, 单价, 金额, 仓库, 数量
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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值