SQL查询多个计数';s导致相同(但不正确)的值

SQL查询多个计数';s导致相同(但不正确)的值,sql,count,Sql,Count,我有一个数据集myTable,如下所示: username saveType Alice auto Alice auto Alice manual Alice manual Bob auto Bob auto Bob auto Bob auto username AutoCount ManualCount Alice 2 2 Bob 4

我有一个数据集myTable,如下所示:

username   saveType

Alice      auto
Alice      auto
Alice      manual
Alice      manual
Bob        auto
Bob        auto
Bob        auto
Bob        auto
username  AutoCount  ManualCount
Alice     2          2
Bob       4          0
我想计算每个用户找到的自动和手动存储类型的数量。 理想情况下,我希望查询结果如下所示:

username   saveType

Alice      auto
Alice      auto
Alice      manual
Alice      manual
Bob        auto
Bob        auto
Bob        auto
Bob        auto
username  AutoCount  ManualCount
Alice     2          2
Bob       4          0
但当我运行此查询时:

SELECT username, COUNT(saveType="auto") AutoCount, COUNT(savetype="manual") ManualCount
FROM myTable
GROUP BY username
我得到的是:

username  AutoCount  ManualCount
Alice     4          4
Bob       4          4

db是。任何关于这里发生的事情的解释都会很有帮助!谢谢

SELECT 
  username, 
  COUNT(case when saveType='auto' then 1 end) AutoCount, 
  COUNT(case when savetype='manual' then 1 end) ManualCount
FROM myTable
GROUP BY username

SELECT 
  username, 
  COUNT(case when saveType='auto' then 1 end) AutoCount, 
  COUNT(case when savetype='manual' then 1 end) ManualCount
FROM myTable
GROUP BY username

将当前查询中的
COUNT
替换为
SUM
,它应该可以工作:

SELECT
    username,
    SUM(saveType='auto')   AutoCount,
    SUM(savetype='manual') ManualCount
FROM yourTable
GROUP BY username;


COUNT(saveType='auto')
的问题在于,其中的表达式的计算结果要么为0(false),要么为1(true)。但是,在这两种情况下,
COUNT
将为它们计数1
SUM
通过有效地忽略零值来解决此问题。

将当前查询中的
COUNT
替换为
SUM
,它应该可以工作:

SELECT
    username,
    SUM(saveType='auto')   AutoCount,
    SUM(savetype='manual') ManualCount
FROM yourTable
GROUP BY username;


COUNT(saveType='auto')
的问题在于,其中的表达式的计算结果要么为0(false),要么为1(true)。但是,在这两种情况下,
COUNT
将为它们计数1
SUM
通过有效地忽略零值来绕过此问题。

您也可以尝试此查询:

select r.username, t1.AutoCount, t2.Manualcount from 
yourtable r inner join (select username,  count(saveType) autoCount from yourtable where saveType='auto' group by username) t1
on t1.username = r.username
inner join  (select username,  count(saveType) ManualCount from yourtable where saveType ='manual' group by username) t2
on t2.username = r.username

希望这能对您有所帮助。

您也可以尝试以下查询:

select r.username, t1.AutoCount, t2.Manualcount from 
yourtable r inner join (select username,  count(saveType) autoCount from yourtable where saveType='auto' group by username) t1
on t1.username = r.username
inner join  (select username,  count(saveType) ManualCount from yourtable where saveType ='manual' group by username) t2
on t2.username = r.username

希望这能对您有所帮助。

这是什么数据库?SQL Server/MySQL/Postgres?请标记数据库。这是什么数据库?SQL Server/MySQL/Postgres?请标记数据库。它出现了一个错误:“sum的参数1:type'boolean'检测到,'decimal'预期:(第3行,第9列)”我看到您在演示中的输出是正确的,这可能只是我的数据库有问题。它出现了一个错误,说:“sum的参数1:type'boolean'检测到,'decimal'预期:(第3行,第9列)”我在演示中看到您的输出是正确的,这可能只是我的DB的问题,然后可能。@TimBiegeleisen,对于count,它将返回null,这就是为什么使用coalesce将null转换为0:)似乎在没有
coalesce的情况下工作正常
COUNT
忽略
NULL
值。@TimBiegeleisen,谢谢-这是一个新的学习,我不知道
coalesce()
是多余的
count()
从不返回
NULL
@TimBiegeleisen,因为count将返回NULL,这就是为什么coalesce用于将NULL转换为0:)在没有
coalesce
的情况下似乎可以正常工作
COUNT
忽略
NULL
值。@TimBiegeleisen,谢谢-这是一个新的学习,我不知道
coalesce()
是多余的
count()
从不返回
NULL