2016-08-11 83 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