【发布时间】:2014-09-04 15:20:59
【问题描述】:
所以简单地说我正在创建一个从 4 个不同表中检索调查数据的视图,我无法控制这些表的结构,因为它们来自第 3 方。
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','43','55') 时才能找到,然后每个 answerID = 某个商店(实际上还有另一个表来链接 answerID storeID 但这与问题无关。)如果我使用 case 语句来查找它,它只会显示一行,这意味着视图表看起来像
+----------+---------+----------+------------+----------+---------+
| 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 填充其余行
我过去曾使用临时表来处理类似的事情,效果很好,但不能在视图中使用它们。
【问题讨论】:
-
一些ddl和样本数据怎么样? sqlfiddle.com 将是一个很好的起点。
-
使用子查询填充 storeID。
-
好吧,当我意识到必须有更好的方法时,我正在对 StoreID 进行子查询,因为还有其他类似的字段,所以我最终会为每个单独的查询做大约 5 个子查询行。
-
我认为你所说的无关紧要的部分是开发替代解决方案的最重要部分。
标签: sql sql-server-2012 window-functions