【问题标题】:SQL report: count total rows per user and count successful transactions per userSQL 报告:计算每个用户的总行数并计算每个用户的成功事务数
【发布时间】:2016-08-23 14:16:16
【问题描述】:

我们正在使用 Firebird 2.1 数据库并尝试运行查询以获取统计总交易和特定状态交易的报告。每个事务都有一个成功 (1) 或不成功 (0) 的状态。还有一个拒绝状态(2),但在 cmets 中有所涵盖。我将使用模棱两可的数据。

USER_ID, Fruit, Eaten
----------------------
1, Apple, 0
1, Banana, 1
1, Kiwi, 1
2, Apple, 1
2, Banana, 1
3, Apple, 0

我们要做的是生成一个显示 USER_ID、TOTAL_FRUIT 和 EATEN_FRUIT 的报告。其中TOTAL_FRUIT统计交易总数,EATEN_FRUIT根据0或1统计成功交易总数

USER_ID, TOTAL_FRUIT, EATEN_FRUIT 
---------------------------------
1, 3, 2
2, 2, 2
3, 1, 0

我们对此 SQL 语句的“最佳”尝试是:

WITH alias1 AS 
        (SELECT USER_ID, count(Fruit) as TOTAL_FRUIT FROM myTable GROUP BY USER_ID),
     alias2 AS
        (SELECT USER_ID, count(Fruit) as EATEN_FRUIT FROM myTable WHERE Eaten=1 GROUP BY USER_ID)
SELECT alias2.USER_ID, TOTAL_FRUIT, EATEN_FRUIT
FROM alias1, alias2

但是,单独的两个数据集都可以正常工作,但是当一起处理时,第一个数据集只是一遍又一遍的第一行。

【问题讨论】:

  • 你以前用过GROUP BY吗?

标签: sql firebird


【解决方案1】:

你应该使用 count(*)、sum() 和 group by

select user_id, count(*), sum(eaten)
from my_table 
group by user_id

你最终也可以管理空值

select user_id, count(*), sum(coalesce(eaten,0))
from my_table 
group by user_id

【讨论】:

  • 太棒了!谢谢!所以,我们刚刚发现我们的“EATEN”状态为 2,被拒绝。我们正在使用: select user_id, count(*), sum(CASE WHEN Eated = 1 THEN 1 END) from my_table group by user_id
  • 对不起。对,所以我们发现有 0 案例表示未处理,1 案例表示已处理,2 表示拒绝。因此,我们必须将所有已处理的案例相加,但排除 2,因为它被拒绝了。我的案例陈述没有任何作用。真的为无知感到抱歉。谢谢!
  • @RobertBroden 您可以使用 NULLIF 而不是 CASE - 像这样:SUM(NULLIF(eaten,2))
  • Firebird 有 NULLIF: firebirdsql.org/refdocs/langrefupd15-nullif.html -- 我想你可能误读了我的评论
  • 这很有帮助,谢谢!我不确定我是否得到了正确的结果,但我明天将与我的同事聊天以使其正常工作。我不得不问他是否有其他原因导致结果错误。非常感谢!
猜你喜欢
  • 2017-08-08
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 2016-11-16
  • 2023-01-22
相关资源
最近更新 更多