/ / Оптимізація запиту з підрахунками окремих стовпців на основі значення іншого стовпчика - sql, sql-server

Оптимізація запиту з підрахунками окремих стовпців на основі значення іншого стовпчика - sql, sql-server

Тут повинен бути кращий спосіб писати це, але я "мпросто не знаю, що це таке. В основному я намагаюся підрахувати окремі значення з одного стовпця, де умова виконується в окремому стовпці. Я знайшов це посилання, але не знаю, як застосувати його тут.

Ось запит, я використовую SQL Server 2008R2

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

Відповіді:

2 для відповіді № 1

Ви можете використовувати той факт, що COUNT DISTINCT не враховує NULL на вашу користь. Щоб перевірити всі рядки, створіть a 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 положення в a 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