2

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

我不确定使我的动态查询不是 sum 而不是动态查询的区别是什么。

这是我以前的工作 ( 1 , 2 , 3 )

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

在这里 给有兴趣的人。

4

1 回答 1

2

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

于 2012-07-19T22:40:38.523 回答