1

私のテーブルには多くの種類のstatusidがあります。特定の値は、テーブルでの作業が「完了」していることを意味します。

何かが「完全」である場合、グループ化されたチェックIDのすべてのstatusid値は1または10または40です。statusid値は連続していません(多くのstatusid値があり、これは単なる抽出です)。誰かがcaseサブクエリでIn句を実行する方法、またはこれを記述するためのよりクリーンな方法を示すことができますか?

期待される結果セット

    checkid    iscomplete
    3           0
    4           1
    5           0
    6           0

行が1つだけで、「10」があるため、4は完了です。値の1つが「1」で、他の値が「2」であるため、3は完全ではありません。5は「30」の値しかないため、完全ではありません。6は「40」が1つあるため完全ではありませんが、「30」も1つあります。

DML:

create table #test1 ( test1id int identity primary key , checkid int  , statusid int )
insert into #test1 ( checkid , statusid ) values (3 , 1)
insert into #test1 ( checkid , statusid ) values (3 , 2)
insert into #test1 ( checkid , statusid ) values (3 , 2)
insert into #test1 ( checkid , statusid ) values (4 , 10)
insert into #test1 ( checkid , statusid ) values (5 , 30)
insert into #test1 ( checkid , statusid ) values (5 , 30)
insert into #test1 ( checkid , statusid ) values (6 , 30)
insert into #test1 ( checkid , statusid ) values (6 , 40)

select  checkid 
, iscomplete =  ( case when count(*) Where #test1.statusid In ( 1,10,40) Then 1 )
from #test1
group by checkid

エラー:

'Where'の近くで、条件が予期されるコンテキストで指定された非ブール型の式。

ありがとう。

4

1 に答える 1

2

要件を満たすクエリを作成する 1 つの方法は次のとおりです。

SELECT
    t.checkid,
    CASE 
        WHEN COUNT_BIG(*) = COUNT
            (
            CASE 
                WHEN t.statusid IN (1,10,40)
                THEN 1 
                ELSE NULL 
            END
            ) 
        THEN 1 
        ELSE 0 
    END
FROM #test1 AS t
GROUP BY
    t.checkid
ORDER BY
    t.checkid;

COUNTこれは、 (式)集計がカウントされないという事実を利用していますNULL(aisde:ただしCOUNT(*))。すべてのエントリがステータス 1、10、または 40 であるグループの場合、ネストされたCASEはそのグループのすべての行に対して 1 を返し、グループの COUNT(*) に等しくなります。グループのメンバーが 1 人でもステータス 1、10、または 40 でない場合、ネストされたCASEは を返しNULLますが、これは ではカウントされませんCOUNT

于 2012-09-19T05:09:02.533 に答える