/ /他の列の値に基づいて異なる列の数を持つクエリの最適化

別の列の値に基づいて別の列のカウントを持つクエリの最適化 - sql、sql-server

これを書くより良い方法があるはずですが、私はそれが何であるかわからないだけです。基本的に私は条件が別の列で満たされている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