当列未知时,使用count()和CTE使用空值的动态数据透视

时间:2012-07-19 22:12:55

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

我太近了! 我有一项调查,客户希望能够使用各种权重查看报告。 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,其底部是我预期结果的非动态示例。

我不确定是什么区别在于我的动态查询不是总和而非动态查询的总和。

这是我以前的工作(123

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

发布here 对于那些感兴趣的人。

1 个答案:

答案 0 :(得分:2)

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

所以,用LEFT JOIN替换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。正如您在上面的代码段中所看到的,将@select_list部分中的.weight替换为.weightcnt,它将起作用。还有一个问题是:为什么不建立与工作示例相同的数据透视查询?