簡體   English   中英

多個自聯接和空值

[英]Multiple Self joins and null values

我確信這將是一個簡單的修復,但我們在這里。

我有一個從清單中提取數據的表格,我想根據幾個問題的答案構建一個報告。

該表設置如下:

list_id | QuestionID | Question   | Answer
   1    |     11     | Supervisor?| Jack
   1    |     12     |  Crew 1?   | Sam
   1    |     13     |  Crew 2?   | Sally
   1    |     14     |  Crew 3?   | NULL

有可能是“船員 3?” 但它通常為空,與 Crew 2 相同。 現在我希望報告看起來像這樣:

Supervisor | Crew 1 | Crew 2 | Crew 3

但是當我使用左連接自連接表時,我只得到包括所有三個船員的結果,而忽略了所有有空字段的實例。

我目前的嘗試是:

SELECT
      sup.Answer AS 'Sup'
      ,C1.Answer AS '1'
      ,C2.Answer AS '2'
      ,C3.Answer AS '3'
  FROM ChecklistDetail AS sup
  LEFT JOIN ChecklistDetail AS C1 
       ON C1.listID =sup.listID

  LEFT JOIN ChecklistDetail AS C2 
       ON C2.listID =sup.listID

  LEFT JOIN ChecklistDetail AS C3 
       ON C3.listID =sup.listID

  WHERE 
  sup.QuestionID = 11
  AND C1.QuestionID = 12
  AND C2.QuestionID = 13
  AND C3.QuestionID = 14

它可能很明顯,但我在谷歌搜索時遇到了一些磚牆,並找到了一堆不太有效的非常接近的答案。 任何幫助,將不勝感激!

要直接回答您的問題,請將問題 id 過濾器放入連接中...這樣檢查是在連接期間進行的,而不是在連接之后(當 id 可能為 NULL 時)。

  SELECT
      sup.Answer AS 'Sup'
      ,C1.Answer AS '1'
      ,C2.Answer AS '2'
      ,C3.Answer AS '3'
  FROM ChecklistDetail AS sup
  LEFT JOIN ChecklistDetail AS C1 
       ON C1.listID =sup.listID
       AND C1.QuestionID = 12
  LEFT JOIN ChecklistDetail AS C2 
       ON C2.listID =sup.listID
       AND C2.QuestionID = 13
  LEFT JOIN ChecklistDetail AS C3 
       ON C3.listID =sup.listID
       AND C3.QuestionID = 14
  WHERE 
      sup.QuestionID = 11

然而,更好的方法可能是條件聚合......

SELECT
  ListID,
  MAX(CASE WHEN QuestionID = 11 THEN Answer END)   AS 'sup', 
  MAX(CASE WHEN QuestionID = 12 THEN Answer END)   AS '1', 
  MAX(CASE WHEN QuestionID = 13 THEN Answer END)   AS '2', 
  MAX(CASE WHEN QuestionID = 14 THEN Answer END)   AS '3'
FROM
  ChecklistDetail
WHERE
  QuestionID IN (11,12,13,14)
GROUP BY
  ListID

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM