Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算不同的id';按不同id分组的,产生不正确计数';s_Sql_Sqlite - Fatal编程技术网

Sql 计算不同的id';按不同id分组的,产生不正确计数';s

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

我有一个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。因此,对于上面的示例,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;