加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 数据库 > MsSql > 正文

sql – 使用无限量的不同值进行透视

发布时间:2020-05-24 16:14:29 所属栏目:MsSql 来源:互联网
导读:我写了这个查询: SELECT s, [1] AS a1, [2] AS a2, [3] AS a3, [4] AS a4FROM (SELECT grade, aid, s FROM m) pPIVOT(SUM(grade)FOR aid IN ([1], [2], [3], [4])) AS pvt ORDER BY pvt.s; 返回结果: s a1 a2 a3 a41

我写了这个查询:

SELECT s,[1] AS a1,[2] AS a2,[3] AS a3,[4] AS a4
FROM (SELECT grade,aid,s FROM m) p
PIVOT
(
SUM(grade)
FOR aid IN ([1],[2],[3],[4])
) AS pvt ORDER BY pvt.s;

返回结果:

s  a1  a2  a3  a4
1  25  69  95  56
2  27  99  16  87
. . . .
99 98  12  34  76

这正是我想要的结果.我的问题是“援助”中并不总是有四个不同的值.是否可以重写此查询(或使用存储过程),以便’a *’列的数量取决于’aid’中有多少个不同的值?

解决方法

您需要使用动态数据透视表来获取所需的列列表.这将首先检索列列表,然后转动该列表.与此类似的东西:
DECLARE @cols AS NVARCHAR(MAX),@query  AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(aid) 
            FROM m 
            FOR XML PATH(''),TYPE
            ).value('.','NVARCHAR(MAX)'),1,'')

set @query = 'SELECT s,' + @cols + ' from 
            (
                select grade,s
                from m
           ) x
            pivot 
            (
                sum(grade)
                for aid in (' + @cols + ')
            ) p 
            ORDER BY p.s'

execute(@query)

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读