Sql 计算不同的id';按不同id分组的,产生不正确计数';s
我有一个SQLite数据库表,它的结构与下面的类似Sql 计算不同的id';按不同id分组的,产生不正确计数';s,sql,sqlite,Sql,Sqlite,我有一个SQLite数据库表,它的结构与下面的类似 name MicrosoftId EventId red 1 10001 blue 1 10001 green 2 10001 blue 2 10001 grey 3 10001 red 4 10002 gre
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。因此,对于上面的示例,EventID10001的大小应为3,EventID10002的大小应为2
我写的SQL没有错误,但是大小来自COUNT(不同的MicrosoftId)都是错误的,我不知道为什么。我做错了什么 问题在于
WHERE
子句,您的WHERE
子句会过滤掉名称,因此count()
将只计算过滤后的名称,这些名称是的“红色”、“蓝色”、“绿色”
因此,只需删除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;
问题在于
WHERE
子句,您的WHERE
子句过滤掉了名称,因此count()
将只计算过滤后的名称,这些名称是的“红色”、“蓝色”、“绿色”
因此,只需删除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;
问题是您的
WHERE
子句。它会删除除“红色”、“蓝色”和“绿色”之外的所有颜色,因此不计算其他颜色。
删除WHERE
子句即可
更新:您只想显示至少有一个红色、绿色或蓝色条目的事件。因此,添加一个HAVING
子句或将查询放入子查询中,以便使用WHERE
。以下是一些选项:
有单独条件的:
具有一种复合状态:
在单独条件下:
在复合条件下:
问题是您的
WHERE
子句。它会删除除“红色”、“蓝色”和“绿色”之外的所有颜色,因此不计算其他颜色。
删除WHERE
子句即可
更新:您只想显示至少有一个红色、绿色或蓝色条目的事件。因此,添加一个HAVING
子句或将查询放入子查询中,以便使用WHERE
。以下是一些选项:
有单独条件的:
具有一种复合状态:
在单独条件下:
在复合条件下:
旁注:单引号是字符串文本的分隔符。对于名称,请使用双引号,例如,
选择EventId作为“event”
,或者在不需要时完全删除它们,例如,选择EventId作为event
。另一方面,请注意:您可能需要添加一个ORDER BY
子句。虽然您可能已经得到了排序结果,但如果没有明确的ORDER BY
,则不能保证这样做。请注意:单引号是字符串文本的分隔符。对于名称,请使用双引号,例如,选择EventId作为“event”
,或者在不需要时完全删除它们,例如,选择EventId作为event
。另一方面,请注意:您可能需要添加一个ORDER BY
子句。虽然您可能已经得到了排序结果,但如果没有明确的ORDER BY,这不能保证保持不变。哦,对了,那就是尝试删除事件中没有我想要的颜色的情况。有没有其他方法可以用SQL过滤掉它们?是的,在总和上添加一个HAVING
子句:HAVING SUM(当name='red'时为1,否则为0结束)>0或SUM(当name='blue'时为1,否则为0结束)>0或…
。(或将整个查询移动到子查询:select*from(查询)q其中红色>0或蓝色>0或绿色>0
或select*from(查询)q其中红色+蓝色+绿色>0
)您好,感谢您的帮助。然而,我在尝试使用HAVING时遇到语法错误。你能不能用一个完整的语法示例来编辑你的答案?哦,对了,那就是试着去掉我在一个事件中找不到任何颜色的情况。有没有其他方法可以用SQL过滤掉它们?是的,在总和上添加一个HAVING
子句:HAVING SUM(当name='red'时为1,否则为0结束)>0或SUM(当name='blue'时为1,否则为0结束)>0或…
。(或将整个查询移动到子查询:select*from(查询)q其中红色>0或蓝色>0或绿色>0
或select*from(查询)q其中红色+蓝色+绿色>0
)您好,感谢您的帮助。然而,我在尝试使用HAVING时遇到语法错误。你能不能用一个完整的语法示例来编辑你的答案?哦,对了,那就是试着去掉我在一个事件中找不到任何颜色的情况。有没有其他方法可以用SQL过滤掉它们呢?哦,对了,那就是试着去除那些我在活动中没有想要的颜色的情况。有没有其他方法可以用SQL过滤掉它们?
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;