Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-使用union按2列或更多列进行组计数需要2秒以上_Sql_Db2_System Tables - Fatal编程技术网

SQL-使用union按2列或更多列进行组计数需要2秒以上

SQL-使用union按2列或更多列进行组计数需要2秒以上,sql,db2,system-tables,Sql,Db2,System Tables,给定一张桌子,我们称之为performance6a- 具有表结构>> 学生id |数学|历史|语言|科学 我需要编写一个查询,生成如下报告- 组计数基于两个类别,在本例中为通过或失败,然后为主题 请注意,这些操作是在无法规范化或重新设计的系统表上执行的。这两个类别的数量都可以增加,类别-通过/不通过可以增加到100,类别-受试者可以增加到~5k 我所尝试的: 此查询提供了正确的输出,但执行时间超过2秒。我正在寻找优化查询的方法。如果您取消PIVOT,然后聚合: select (case when

给定一张桌子,我们称之为performance6a- 具有表结构>> 学生id |数学|历史|语言|科学

我需要编写一个查询,生成如下报告-

组计数基于两个类别,在本例中为通过或失败,然后为主题

请注意,这些操作是在无法规范化或重新设计的系统表上执行的。这两个类别的数量都可以增加,类别-通过/不通过可以增加到100,类别-受试者可以增加到~5k

我所尝试的:

此查询提供了正确的输出,但执行时间超过2秒。我正在寻找优化查询的方法。

如果您取消PIVOT,然后聚合:

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;