多个自我联接和空值

扎克·沃特金斯(Zac Watkins)

我敢肯定,这将是一个简单的解决方法,但是到此为止。

我有一个表,该表从清单中提取数据,并且我想基于一些问题的答案来构建报告。

该表的设置如下:

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”吗?但它通常为null,就此而言与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

它可能很明显,但我在Google搜索中碰到了一些砖墙,发现了一堆非常接近的答案,但不太奏效。任何帮助,将不胜感激!

MatBailie

要直接回答您的问题,请将问题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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Access中的多个自我联接或联合

来自分类Dev

如何在多个自我联接上指定排序顺序

来自分类Dev

联接值和可为空的值

来自分类Dev

SQL Server自我联接等

来自分类Dev

如何在同一行上建立联接和自我联接

来自分类Dev

左外部联接和空值转换

来自分类Dev

联接和最大日期为空值

来自分类Dev

左外部联接和空值转换

来自分类Dev

如何将多个自我联接查询转换为递归CTE

来自分类Dev

从多个重复字段中获取数据时,自我联接是否可以继续使用BigQuery?

来自分类Dev

Oracl SQL从多个自我联接中删除不相同的重复项

来自分类Dev

Mysql:创建具有多个自我联接的视图,结果中没有重复项

来自分类Dev

通过自我联接更新列表<T>?

来自分类Dev

在RavenDB中自我左联接

来自分类Dev

左侧只有自我表的联接

来自分类Dev

使用跨多个表的联接处理空值

来自分类Dev

LINQ-具有可为空值的多个左联接

来自分类Dev

Mysql:多个自我加入?

来自分类Dev

SQL,对3个联接表进行自我联接

来自分类Dev

从多个重复字段中获取数据时,自我联接是继续BigQuery的一种方式吗?

来自分类Dev

自我加入和雄辩

来自分类Dev

在联接LINQ中使用多个条件。我和

来自分类Dev

javascript将多个空格转换为输入值自我修整

来自分类Dev

查询联接空值(左外部联接)

来自分类Dev

具有多个条件的自我加入

来自分类Dev

在LINQ中使用聚合查询进行自我联接

来自分类Dev

SQL Server 2012-帮助进行自我联接或CTE

来自分类Dev

在has_one关系中使用自我联接模型

来自分类Dev

如何使用自我联接重塑熊猫中的重复行?