所以简单地说我正在创建一个从4个不同的表中检索调查数据的视图,我不能控制这些表的结构,因为它们来自第三方。
SELECT v.SurveyID, v.VoterID, v.VoteDate, a.QuestionId, a.AnswerId,
(CASE WHEN a.questionid IN ('8', '509', '514', '516', '518', '519', '577', '723','724', '725', '726', '727', '730')
THEN Fn_surveyconvertanswer(a.answerid, '') ELSE (CASE WHEN a.questionid IN ('758','124') AND a.answerid IN ('2631', '647') THEN CONVERT(INT, CONVERT(VARCHAR(MAX), va.answertext)) ELSE '' END)
END) AS StoreID
FROM Answer a
LEFT JOIN VoterAnswers AS va ON a.AnswerId = va.AnswerID
LEFT JOIN Voter v AS v ON va.VoterID = v.VoterID
LEFT JOIN Question q AS q ON a.QuestionId = q.QuestionId
现在说我还需要一个带有StoreID的列,只有在说出QuestionID时才会找到(' 3',''' 55')然后每个answerID =某个商店(实际上有另一个表将answerID链接到storeID,但这与问题无关。)如果我使用case语句来查找它,它只显示一行,这意味着views表看起来像
+----------+---------+----------+------------+----------+---------+
| SurveyID | VoterID | VoteDate | QuestionId | AnswerID | StoreID |
+----------+---------+----------+------------+----------+---------+
| 5 | 1 | 9/4/2014 | 1 | 52 | 0 |
| 5 | 1 | 9/4/2014 | 2 | 43 | 0 |
| 5 | 1 | 9/4/2014 | 3 | 78 | 97 |
| 5 | 1 | 9/4/2014 | 4 | 87 | 0 |
| 5 | 1 | 9/4/2014 | 5 | 98 | 0 |
+----------+---------+----------+------------+----------+---------+
如何将storeID 97放在所有行中,因为所有调查数据都是针对该商店的?
EX。
+----------+---------+----------+------------+----------+---------+
| SurveyID | VoterID | VoteDate | QuestionId | AnswerID | StoreID |
+----------+---------+----------+------------+----------+---------+
| 5 | 1 | 9/4/2014 | 1 | 52 | 97 |
| 5 | 1 | 9/4/2014 | 2 | 43 | 97 |
| 5 | 1 | 9/4/2014 | 3 | 78 | 97 |
| 5 | 1 | 9/4/2014 | 4 | 87 | 97 |
| 5 | 1 | 9/4/2014 | 5 | 98 | 97 |
+----------+---------+----------+------------+----------+---------+
我通过在VoterID基本上相同的查询上进行左连接来工作(因为这对于每次调查也是唯一的)并进行一些分组但现在有多个字段,如上面的StoreID以相同的方式收集。它开始变得一团糟,实际上在保存为视图时会导致一些奇怪的分组错误。 (奇怪的是作为一个独立的查询工作得很好)我想知道是否有一个更好的更有效的方式来使用storeID填充其余的行
我过去曾经使用临时表这样的东西效果很好但不能在视图中使用它们。
答案 0 :(得分:1)
使用WITH语句添加CTE查询并将它们连接到您查看,而不是使用内联子查询。
更好的是,您应插入缺少的行,以便将所有记录加入相应的商店。
如果将MAX()设置为0,则可以使用MAX():
MAX(<ShopId case clause>) OVER() as ShopId