これを書くより良い方法があるはずですが、私はそれが何であるかわからないだけです。基本的に私は条件が別の列で満たされている1つの列からの異なる値を数えようとしています。 リンクしかし、ここでそれを適用する方法がわからない。
これがクエリです、私はSQL Server 2008 R2を使用しています
SELECT lot,
(SELECT COUNT(DISTINCT d.pid) FROM invdet d WHERE upk = 0 and d.lot = [invdet].lot) as noUpk,
(SELECT COUNT(DISTINCT d.pid) FROM invdet d WHERE upk = 1 and d.lot = [invdet].lot) as isUpk
FROM invdet
WHERE ([status] in ("PQ","P2","FA","F2","BH","RL","SC","LD","PS"))
GROUP BY lot
HAVING COUNT(CASE WHEN invdet.upk = 1 THEN 1 ELSE null END) > 0
回答:
回答№1は2あなたは事実を使用することができます COUNT DISTINCT
あなたの利点のためにNULLを数えません。すべての行を調べるために、 WHERE EXISTS
結果セットをこれらのステータスに制限する代わりに、次の句を使用します。
SELECT lot,
COUNT(DISTINCT (CASE WHEN upk = 0 THEN pid ELSE NULL END)) as noUpk
COUNT(DISTINCT (CASE WHEN upk = 1 THEN pid ELSE NULL END)) as isUpk
FROM invdet q
WHERE EXISTS
(
SELECT 1
FROM invdet i
WHERE i.[status] in ("PQ","P2","FA","F2","BH","RL","SC","LD","PS")
AND i.lot = q.lot
)
GROUP BY lot
HAVING COUNT(CASE WHEN upk = 1 THEN 1 ELSE null END) > 0
効果的に移動することもできます HAVING
の節 WHERE EXISTS
節も同様です。
SELECT lot,
COUNT(DISTINCT (CASE WHEN upk = 0 THEN pid ELSE NULL END)) as noUpk
COUNT(DISTINCT (CASE WHEN upk = 1 THEN pid ELSE NULL END)) as isUpk
FROM invdet q
WHERE EXISTS
(
SELECT 1
FROM invdet i
WHERE i.[status] in ("PQ","P2","FA","F2","BH","RL","SC","LD","PS")
AND i.lot = q.lot
)
WHERE EXISTS
(
SELECT 1
FROM invdet i
WHERE i.upk = 1
AND i.lot = q.lot
)
GROUP BY lot