【问题标题】:Dynamic pivot with nulls using count() and CTE when columns are unknown当列未知时,使用 count() 和 CTE 使用空值进行动态透视
【发布时间】:2012-07-19 22:12:55
【问题描述】:

我很接近! 我有一个调查,客户希望能够看到使用各种权重的报告作为答案。 SQLFiddle 只允许 2008 年及更高版本,但在 2005 年我得到了这些结果:

Lesson wt count -> | w1_5 | w2 | w3 | w5_5 | w6_5 | N
-----------------------------------------------------
q2                 | 1.5  | 2  | 3  | 5.5  | 6.5  | 9

显然,它们应该是计数而不是权重。

此外,返回的唯一记录恰好是包含 0 个空值的行。

我创建了一个SQLFiddle,底部是我预期结果的非动态示例。

我不确定使我的动态查询不求和和非动态查询的区别是什么。

这是我之前的作品(1,2,3)

---更新---最终解决方案---

发表于here 对于那些有兴趣的人。

【问题讨论】:

    标签: sql sql-server sql-server-2005


    【解决方案1】:

    您的动态 sql 内部连接每个派生表,并且您为每个权重使用一个派生表。某些权重不存在,因此结果为空结果集。如果将内部替换为左连接,您将看到您的数据,但看到的是权重值,而不是计数。老实说,我不明白你为什么要首先进行连接。为什么不生成类似于您在小提琴底部显示的枢轴示例的枢轴查询?

    因此,将 JOIN 替换为 LEFT JOIN:

    SELECT -- Weight as the alias for join uniqueness
        @join_List = @join_List + ' 
    LEFT JOIN 
        (
            SELECT lessonid, weight, count(weight) AS weightcnt 
            FROM tblResultsChoices 
            GROUP BY lessonid,weight
        ) w' + REPLACE(weight,'.','_') + ' 
    ON (w' + REPLACE(weight,'.','_') + '.lessonid = weight_count.lessonid AND w' + REPLACE(weight,'.','_') + '.weight = ' + weight + '' +')'
        ,@select_List = @select_List + 
            ',isnull(w' + REPLACE(weight,'.','_') + '.weightcnt , 0) as w' + REPLACE(weight,'.','_') + ''
        ,@pivot_List = COALESCE(@pivot_List + ',', '') + '[' + weight + ']'
    FROM Weights 
    

    哦,关于 Sql Fiddle:如果我理解了我被告知的内容,如果你想在同一批中使用分号,你应该用分号分隔每个句子。不过还没试过。

    更新:玩得更久了。您正在生成select w1.weight,它应该是w1.weightcnt。正如您在上面的代码 sn-p 中看到的,将@select_list 部分中的.weight 替换为.weightcnt,它将起作用。仍然存在一个问题:您为什么不构建与工作示例相同的数据透视查询?

    【讨论】:

    • 是的,透视查询要简单得多。这就是我现在正在做的事情。我一直在为另一个查询使用更复杂的查询,但没有意识到我给自己造成的额外复杂性。
    • 我很高兴我们在同一页上结束了。当代码开始堆积时,很容易误入歧途。祝你的项目好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多