2016-08-11 3 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は、このためのSQL文で0または1

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

私たちの「最高」の試みに基づいて成功したトランザクションの合計を数えるどこだった:

しかし
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

を管理することができます

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

でCOUNT(*)、SUM()とグループを使用する必要がありますが、あなたは前に 'GROUP BY'を使用することがありますか? – mszymborski

答えて

3

あなたは最終的にもNULL値のため

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

恐ろしい!ありがとうございました!だから、私たちは、「EATEN」ステータスが2であることが判明しましたが、これは拒否されました。私たちは使用しています:select user_id、count(*)、sum(食べた時= 1 THEN 1 END) from my_table グループby user_id –

+0

ああ、ごめんなさい。処理されていない場合は0件、処理済みの場合は1件、拒否された場合は2件あることがわかりました。したがって、処理されたすべてのケースを合計する必要がありますが、拒否されたため2を除外しています。私のケースステートメントは何の役にも立たなかった。無知を本当に残念。ありがとう! –

+1

@RobertBroden 'CASE'の代わりに' NULLIF'を使用することができます: 'SUM(NULLIF(eaten、2))' – Nicarus

関連する問題