【问题标题】:Joining rows and columns in SQL在 SQL 中连接行和列
【发布时间】:2021-01-29 00:55:32
【问题描述】:

当前结果:

ID | Item      | Red | Green | Blue | Yellow
03   balloon      1      0       0      0
03   balloon      0      1       0      0
03   balloon      1      0       0      1
24   ribbon       0      0       1      0
24   ribbon       0      1       0      0
24   ribbon       0      0       0      1
24   ribbon       1      0       0      0

期望的结果:

ID | Item      | Red | Green | Blue | Yellow
03   balloon      1      1       0      1
24   ribbon       1      1       1      1

我不希望它们像我当前的结果那样重复。

这是我的查询:

SELECT DISTINCT tb1.ID
      , tb1.Item
      , (CASE WHEN tb2.color = 'Red' THEN 1 END) AS 'Red'
      , (CASE WHEN tb2.color = 'Green' THEN 1 END) AS 'Green'
      , (CASE WHEN tb2.color = 'Blue' THEN 1 END) AS 'Blue'
      , (CASE WHEN tb2.color = 'Yellow' THEN 1 END) AS 'Yellow'
FROM #table1 tb1
LEFT JOIN #table2 tb2 ON tb1.ID = tb2.ID 

我也尝试过没有 distinct ,但我不知道如何更改以使其看起来像预期的结果。

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)的 SQL,并以表格格式作为代码输入。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。

标签: sql join left-join distinct case-when


【解决方案1】:

使用聚合:

SELECT tb1.ID, tb1.Item
      MAX(CASE WHEN tb2.color = 'Red' THEN 1 ELSE 0 END) AS Red,
      MAX(CASE WHEN tb2.color = 'Green' THEN 1 ELSE 0 END) AS Green,
      MAX(CASE WHEN tb2.color = 'Blue' THEN 1 ELSE 0 END) AS Blue,
      MAX(CASE WHEN tb2.color = 'Yellow' THEN 1 ELSE 0 END) AS Yellow
FROM #table1 tb1 LEFT JOIN
     #table2 tb2 
     ON tb1.ID = tb2.ID 
GROUP BY tbl1.ID;

请注意,您当前的结果应该返回 NULL 而不是 0。我添加了ELSE 0,所以你明确得到0

另外,不要对列别名使用单引号。仅对字符串和日期常量使用单引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 2020-11-03
    • 2015-10-17
    相关资源
    最近更新 更多