经典的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)
月份, 商品, 单价, 金额, 仓库, 数量
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语句
- 行列转换等经典SQL语句
- 运用设计模式实现Sql语句动态转换
- Sql Server 生成数据透视表 (行列转换等经典SQL语句)
- [转]行列转换等经典SQL语句
- 行列转换等经典SQL语句
- 行列转换等经典SQL语句
- 行列转换等经典SQL语句
- 行列转换等经典SQL语句
- 行列转换-->动态SQL语句例子
- 行列转换等经典SQL语句
- 行列转换等经典SQL语句
- 行列转换等经典SQL语句
- 行列转换 经典SQL语句
- 行列转换等经典SQL语句
- 行列转换等经典SQL语句
- SQL 行列转换--经典案例
- 一个SQL语句的问题:行列转换
- 【ORACLE】一个简单实用的对数据进行行列转换并统计的SQL语句
- SQL Server SQL性能优化之--pivot行列转换减少扫描计数优化查询语句