SQL-使用union按2列或更多列进行组计数需要2秒以上
给定一张桌子,我们称之为performance6a- 具有表结构>> 学生id |数学|历史|语言|科学 我需要编写一个查询,生成如下报告- 组计数基于两个类别,在本例中为通过或失败,然后为主题 请注意,这些操作是在无法规范化或重新设计的系统表上执行的。这两个类别的数量都可以增加,类别-通过/不通过可以增加到100,类别-受试者可以增加到~5k 我所尝试的: 此查询提供了正确的输出,但执行时间超过2秒。我正在寻找优化查询的方法。如果您取消PIVOT,然后聚合:SQL-使用union按2列或更多列进行组计数需要2秒以上,sql,db2,system-tables,Sql,Db2,System Tables,给定一张桌子,我们称之为performance6a- 具有表结构>> 学生id |数学|历史|语言|科学 我需要编写一个查询,生成如下报告- 组计数基于两个类别,在本例中为通过或失败,然后为主题 请注意,这些操作是在无法规范化或重新设计的系统表上执行的。这两个类别的数量都可以增加,类别-通过/不通过可以增加到100,类别-受试者可以增加到~5k 我所尝试的: 此查询提供了正确的输出,但执行时间超过2秒。我正在寻找优化查询的方法。如果您取消PIVOT,然后聚合: select (case when
select (case when score > 30 then 'PASS' else 'FAIL' end) as status, subject, count(*)
from ((select 'math' as subject, math as score from PERFORMANCE6A) union all
(select 'history' as subject, history as score from PERFORMANCE6A) union all
(select 'language' as subject, language as score from PERFORMANCE6A) union all
(select 'science' as subject, science as score from PERFORMANCE6A)
) ss
group by (case when score > 30 then 'PASS' else 'FAIL' end), subject
试试这个:
WITH PERFORMANCE6A (STUDENT_ID, MATH, HISTORY, LANGUAGE, SCIENCE) AS
(
VALUES
(1, 23, 42, 40, 35)
, (2, 45, 21, 25, 36)
, (3, 32, 12, 15, 27)
, (4, 49, 45, 38, 31)
, (5, 50, 43, 37, 41)
)
SELECT RESULT, NAME, COUNT(1) CNT
FROM
(
SELECT
D.NAME
, CASE
WHEN D.NAME = 'MATH' THEN CASE WHEN P.MATH > 30 THEN 'PASS' ELSE 'FAIL' END
WHEN D.NAME = 'HISTORY' THEN CASE WHEN P.HISTORY > 30 THEN 'PASS' ELSE 'FAIL' END
WHEN D.NAME = 'LANGUAGE' THEN CASE WHEN P.LANGUAGE > 30 THEN 'PASS' ELSE 'FAIL' END
WHEN D.NAME = 'SCIENCE' THEN CASE WHEN P.SCIENCE > 30 THEN 'PASS' ELSE 'FAIL' END
END AS RESULT
FROM PERFORMANCE6A P
CROSS JOIN (VALUES 'MATH', 'HISTORY', 'LANGUAGE', 'SCIENCE') D (NAME)
)
GROUP BY RESULT, NAME
ORDER BY RESULT, NAME;
“谢谢,”戈登·林诺夫说。它将执行时间降低到约800毫秒
WITH PERFORMANCE6A (STUDENT_ID, MATH, HISTORY, LANGUAGE, SCIENCE) AS
(
VALUES
(1, 23, 42, 40, 35)
, (2, 45, 21, 25, 36)
, (3, 32, 12, 15, 27)
, (4, 49, 45, 38, 31)
, (5, 50, 43, 37, 41)
)
SELECT RESULT, NAME, COUNT(1) CNT
FROM
(
SELECT
D.NAME
, CASE
WHEN D.NAME = 'MATH' THEN CASE WHEN P.MATH > 30 THEN 'PASS' ELSE 'FAIL' END
WHEN D.NAME = 'HISTORY' THEN CASE WHEN P.HISTORY > 30 THEN 'PASS' ELSE 'FAIL' END
WHEN D.NAME = 'LANGUAGE' THEN CASE WHEN P.LANGUAGE > 30 THEN 'PASS' ELSE 'FAIL' END
WHEN D.NAME = 'SCIENCE' THEN CASE WHEN P.SCIENCE > 30 THEN 'PASS' ELSE 'FAIL' END
END AS RESULT
FROM PERFORMANCE6A P
CROSS JOIN (VALUES 'MATH', 'HISTORY', 'LANGUAGE', 'SCIENCE') D (NAME)
)
GROUP BY RESULT, NAME
ORDER BY RESULT, NAME;