您的动态 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
,它将起作用。仍然存在一个问题:为什么不构建与工作示例相同的数据透视查询?