为了账号安全,请及时绑定邮箱和手机立即绑定

支点动态列,没有聚合

支点动态列,没有聚合

繁星点点滴滴 2019-07-05 16:01:09
支点动态列,没有聚合我有调查问卷的数据,SQLServer 2008,我想转到一个矩阵。我看到了几篇关于同一个话题的帖子,但我就是没有兴趣。表如下:Question tableAnswer tableCustomer table各栏:[CustomerID], [QuestionName_1], .., [QuestionName_n] <- 动态问题栏数目)数据:CustomerID, Answer_1, .., Answer_n检索列的代码:DECLARE @columns VARCHAR(8000)SELECT @columns = COALESCE(@columns + ',[' + cast(QuestionName as varchar) + ']', '[' + cast(QuestionName as varchar)+ ']')FROM Answer A  INNER JOIN Question Q ON A.QuestionID = Q.QuestionIDINNER JOIN Customer C ON A.CustomerID = C.CustomerIDGROUP B Y Q.QuestionNameSET @columns = '[CustomerID],' + @columnsDECLARE @query VARCHAR(8000)SET @query = 'Some PIVOT query without  aggregation'EXECUTE(@query)最初的查询思想是从带动力柱的枢轴.可以这样做吗?旋转查询会是什么样的呢?PS:我不想使用排名与最大的列数。问候,米歇尔
查看完整描述

1 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

是的,您可以执行动态支点。有时更容易计算出PIVOT首先使用静态版本进行查询,这样您就可以看到查询和结果将如何出现。然后将查询转换为动态版本。

下面是查询的静态版本和动态版本的示例:

静态(SQL Fiddle):

select *from (
    select u.userid,
        u.fname,
        u.lname,
        u.mobile,
        r.question,
        r.choice    from users u    left join results r        on u.questionid = r.questionid        
        and u.choiceid = r.choiceid) xpivot(
    min(choice)
    for question in([are you], [from])) p

动态(SQL Fiddle):

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.question) 
            FROM results c            FOR XML PATH(''), TYPE            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')set @query = 'SELECT userid, fname, lname, mobile, ' + @cols + ' from 
            (
                select u.userid,
                    u.fname,
                    u.lname,
                    u.mobile,
                    r.question,
                    r.choice
                from users u
                left join results r
                    on u.questionid = r.questionid
                    and u.choiceid = r.choiceid
           ) x
            pivot 
            (
                min(choice)
                for question in (' + @cols + ')
            ) p 'execute(@query)

如果您可以提供关于当前表结构的更多详细信息,然后提供一些示例数据。我们应该能够帮助您创建适合您的情况所需的版本。

不过,正如我所说的,有时从静态版本开始比较容易,在静态版本中,首先需要转换列中的硬代码,然后再转到动态版本。


查看完整回答
反对 回复 2019-07-05
  • 1 回答
  • 0 关注
  • 455 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信