MySQL group by for missing values

时间:2018-04-18 17:38:36

标签: mysql sql

给出一个包含以下数据的表

ID Value
1  A
1  B
1  C
1  D
2  A
2  C
3  A

我想构建一个查询,根据存在的值A返回id集中缺少哪些值。可以假设“A”的ID始终存在。 结果:

ID | B | C | D
2  | 0 | 1 | 0
3  | 0 | 0 | 0

值为A,B,C,D。在此示例中,所有值都用于ID 1,但是如果A是ID 2的值,则表格报告缺少B,依此类推。

我有一个查询来返回给定值缺少哪个ID但是我还没有找到将所有三个ID加在一起的方法:

select id
from table_1 
where  id not in (
    select id
    from table_1
    where value = 'B' #additional queries replacing 'B' with 'C' and 'D'
)  and value = 'A' 
order by id asc

是否可以将这三个单独的查询组合到我已经列出的结果表中?我觉得这需要内部联接,但是无法构建一个有效的查询。

1 个答案:

答案 0 :(得分:1)

您可以使用条件聚合:

SELECT id,
  SUM(Value = 'A') AS a,
  SUM(Value = 'B') AS b,
  SUM(Value = 'C') AS c,
  SUM(Value = 'D') AS d
FROM tab
GROUP BY id;

<强> DBFiddle Demo

必须事先知道值列表(A,B,C,D)。

如果存在所有值,则跳过行:

SELECT *
FROM (
  SELECT id, SUM(Value = 'A') AS a,
   SUM(Value = 'B') AS b,
   SUM(Value = 'C') AS c,
   SUM(Value = 'D') AS d
  FROM tab
  GROUP BY id
) sub
WHERE NOT (a>0 and b>0 and c>0 and d>0);

<强> DBFiddle Demo2