我有一个SQLite数据库表,其结构与以下类似...
name MicrosoftId EventId
red 1 10001
blue 1 10001
green 2 10001
blue 2 10001
grey 3 10001
red 4 10002
green 5 10002
blue 5 10002
etc...
...并且我正在使用以下查询来生成有关该表的一些数据:
SELECT EventId as 'event', COUNT(DISTINCT MicrosoftId) as 'size',
SUM(CASE WHEN name = 'red' THEN 1 ELSE 0 END) as 'red',
SUM(CASE WHEN name = 'blue' THEN 1 ELSE 0 END) as 'blue',
SUM(CASE WHEN name = 'green' THEN 1 ELSE 0 END) as 'green'
FROM TagsMSCV
WHERE name IN ('red','blue','green')
GROUP BY EventId
发生问题的地方是我正在制作的“大小”列。应该是一个EventId中有多少个唯一的MicrosoftId。因此,对于以上示例,EventId 10001的大小应为3,EventId 10002的大小应为2。
我编写的SQL没有错误,但是COUNT(DISTINCT MicrosoftId)的大小全错了,我不知道为什么。我究竟做错了什么?
问题是你的WHERE
条款。它会删除“红色”,“蓝色”和“绿色”以外的所有颜色,因此您无需计算其他颜色。删除该WHERE
子句就可以了。
更新:您只想显示至少具有一个红色,绿色或蓝色条目的事件。因此,请添加HAVING
子句或将您的查询放入子查询中以使用WHERE
。以下是一些选项:
SELECT
EventId as event,
COUNT(DISTINCT MicrosoftId) as size,
SUM(CASE WHEN name = 'red' THEN 1 ELSE 0 END) as red,
SUM(CASE WHEN name = 'blue' THEN 1 ELSE 0 END) as blue,
SUM(CASE WHEN name = 'green' THEN 1 ELSE 0 END) as green
FROM TagsMSCV
GROUP BY EventId
HAVING SUM(CASE WHEN name = 'red' THEN 1 ELSE 0 END) > 0
OR SUM(CASE WHEN name = 'blue' THEN 1 ELSE 0 END) > 0
OR SUM(CASE WHEN name = 'green' THEN 1 ELSE 0 END) > 0
ORDER BY event;
SELECT
EventId as event,
COUNT(DISTINCT MicrosoftId) as size,
SUM(CASE WHEN name = 'red' THEN 1 ELSE 0 END) as red,
SUM(CASE WHEN name = 'blue' THEN 1 ELSE 0 END) as blue,
SUM(CASE WHEN name = 'green' THEN 1 ELSE 0 END) as green
FROM TagsMSCV
GROUP BY EventId
HAVING SUM(CASE WHEN name IN ('red', 'blue', 'green') THEN 1 ELSE 0 END) > 0
ORDER BY event;
SELECT *
FROM
(
SELECT
EventId as event,
COUNT(DISTINCT MicrosoftId) as size,
SUM(CASE WHEN name = 'red' THEN 1 ELSE 0 END) as red,
SUM(CASE WHEN name = 'blue' THEN 1 ELSE 0 END) as blue,
SUM(CASE WHEN name = 'green' THEN 1 ELSE 0 END) as green
FROM TagsMSCV
GROUP BY EventId
) q
WHERE red > 0 OR blue > 0 OR green > 0
ORDER BY event;
SELECT *
FROM
(
SELECT
EventId as event,
COUNT(DISTINCT MicrosoftId) as size,
SUM(CASE WHEN name = 'red' THEN 1 ELSE 0 END) as red,
SUM(CASE WHEN name = 'blue' THEN 1 ELSE 0 END) as blue,
SUM(CASE WHEN name = 'green' THEN 1 ELSE 0 END) as green
FROM TagsMSCV
GROUP BY EventId
) q
WHERE red + blue + green > 0
ORDER BY event;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句