您的位置:首页 > 数据库

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

2011-04-28 09:50 525 查看
一表:信息如下
月份, 商品, 单价, 金额, 仓库, 数量
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql insert table