2016-08-25 9 views
-4

IDと状態が1つのテーブルにある以下のシナリオを解決する最善の方法を知りたかったのです。 Acceptedは終了状態です。特定のIDに対して状態が受け入れられると、それ以上の更新はそのIDに対して発生しません。例えばIDの選択データをカウントする

、これは表が今

ID | State 
-----+----------------  
12 | Not Accepted 
12 | Not Accepted 
12 | Accepted 
45 | Not Accepted 
67 | Not Accepted 

をどのように見えるかですが、私は受け入れられると受け付けられないバケットに個別のIDをカウントします。

idが受け入れられた状態に達した場合は、それはacceptedバケットでカウントする必要があります(前述の「受け入れられていない」という状態は無視してください)。 id = 12の例では、受け入れられていない2つの状態と1つの受け入れ可能な状態があるため、acceptedのカウントだけをインクリメントする必要があります。私が試した

期待される結果

Accepted | Not Accepted 
---------+-------------- 
    1 |  2 

は、このSQL文ですが、それは私が取得

SELECT 
    SUM(CASE WHEN state = 'Accepted' THEN 1 ELSE 0 END) AS accepted, 
    SUM(CASE WHEN state != 'Accepted' THEN 1 ELSE 0 END) AS nonaccepted 
FROM 
    SAMPLE; 

結果、正しい結果が得られていません:

Accepted | Not Accepted 
---------+------------- 
    1 |  4 
+0

1)あなたが何を求めているかは完全にはっきりしていません。あなた自身がこれをやろうとしたSQLを投稿し、そのクエリから得た結果を含め、問題をより明確に述べてください。 2)あなたがそれを作っている間、あなたが求めている問題や質問を述べるようにあなたのタイトルを改善してください。冗長性のあるタグ情報(SQLとOracle)を削除すると、* Basic *が残ってしまいます。あなたのタイトルには、あなたが持っている問題や質問していることを明確に述べておくべきであり、将来の読者が検索結果のセットに見ても意味があるはずです。[ask]を参照してください。 –

+0

あなたはチャンピオン、Vikです!あなたの投稿を編集して正しくフォーマットしました。フォーマットを削除するためにもう一度編集したことがあります。あなたの上で良い! – mathguy

+0

ごめんなさい@mathguy、あなたの書式を削除するつもりはありませんでした。私はすでに編集モードになっていて、それをもっと賢明にしています。 –

答えて

2

わからないが正確に何を求めているのですか?あなたはこれが欲しいと思います:

select sum(case when min_state = 'Accepted' then 1 else 0 end) accepted_cnt, 
     sum(case when min_state = 'Not Accepted' then 1 else 0 end) not_accepted_cnt 
from (select id, min(state) min_state 
     from my_table 
     group by id); 
+0

@Art Trifonovに感謝します –

関連する問題