2016-08-11 81 views
0

我们正在使用Firebird 2.1数据库,并试图运行针对某个特定状态的总交易和交易的报表的查询。每个事务都有一个成功(1)或不成功(0)的状态。还有一个被拒绝的地位(2),但是这在评论中已经涵盖了。我将使用不明确的数据。SQL报告:统计每个用户的总行数并计算每个用户的成功事务数

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 

然而,两个数据集本身都可以正常工作,但是当一起处理时,第一个数据集只是一遍又一遍。

+0

您以前用过'GROUP BY'? – mszymborski

回答

3

你应该使用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 
+0

太棒了!谢谢!所以,我们发现我们有一个被拒绝的“EATEN”状态2。我们正在使用:select user_id,count(*),sum(CASE WHEN eaten = 1 THEN 1 END) from my_table group by user_id –

+0

哦,对不起。对,所以我们发现有0个案件没有处理,1个案件处理,2个被拒绝。因此,我们必须对所有已处理的案件进行总结,但不包括2,因为它被拒绝。我的病例陈述没有任何方式。真的为无知感到抱歉。谢谢! –

+1

@RobertBroden而不是'CASE',你可以使用'NULLIF' - 像这样:'SUM(NULLIF(eaten,2))' – Nicarus