SQL查询案例:动态行列转换处理

 

本文使用的测试表 与测试数据,请参考  SQL查询案例:行列转换

 

以前写的 行列转换, 是 静态直接写 SQL 的。

也就是写SQL的时候, 就会知道, 具体有哪些列需要被转换。

 

如果要动态的处理, 也就是 列的数量, 是不确定的。

那么只能使用 存储过程来处理了。

 

注:  下面的 SQL  是在  SQL  Server  2005  及以上版本可用。  (SQL Server 2000 及以下版本的, 下面的写法不支持)

 

使用 CASE WHEN 方式的动态处理.

BEGIN   -- 主 SQL.   DECLARE @MainSql  varchar(2000);   -- 产生动态列的 SQL.   DECLARE @ColumnSql  varchar(1000);

  -- 设置 产生动态列的 SQL.   SET @ColumnSql =     (       SELECT         ', SUM(CASE WHEN place = ''' + place + ''' THEN valuw ELSE 0 END) AS ' + place       FROM         TestRowCol       GROUP BY         place       FOR XML PATH('')     );

  -- 设置主 SQL.   SET @MainSql =     'SELECT name ' + @ColumnSql + ' FROM TestRowCol GROUP BY name';

  -- 执行主 SQL.   EXECUTE  ( @MainSql ); END GO

name       北           东           南           西 ---------- ----------- ----------- ----------- ----------- 李四                   8           5           6           7 张三                   4           1           2           3

 

使用 PIVOT 方式的动态处理.

BEGIN   -- 主 SQL.   DECLARE @MainSql  varchar(2000);   -- 产生动态列的 SQL.   DECLARE @ColumnSql  varchar(1000);

  -- 设置 产生动态列的 SQL.   SET @ColumnSql =     STUFF(       (         SELECT           ',' + place         FROM           TestRowCol         GROUP BY           place         FOR XML PATH('')       ), 1, 1, '');

  -- 设置主 SQL.   SET @MainSql =     'SELECT * FROM TestRowCol '     + ' PIVOT( SUM(valuw) FOR place IN ( '     + @ColumnSql     + ' ) ) tmp ORDER BY name';

  -- 执行主 SQL.   EXECUTE  ( @MainSql ); END GO

 

name       北           东           南           西 ---------- ----------- ----------- ----------- ----------- 李四                   8           5           6           7 张三                   4           1           2           3

(2 行受影响)

转载于:https://www.cnblogs.com/qqliukk/p/3364978.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值