Sql 查询性能调整-搜索其他选项

Sql 查询性能调整-搜索其他选项,sql,performance,Sql,Performance,我需要知道是否存在其他方法来执行此查询 表考试具有以下结构: EXAM_DATE DATE SUBJECT VARCHAR2(50); GRADE NUMBER; 这个概念是从考试中获取统计数据 select EXAM_DATE, SUBJECT, (SELECT COUNT(1) from EXAMS where GRADE IN (9,10) AND SUBJECT =

我需要知道是否存在其他方法来执行此查询

考试
具有以下结构:

EXAM_DATE DATE
SUBJECT VARCHAR2(50);
GRADE NUMBER;
这个概念是从考试中获取统计数据

select EXAM_DATE,
        SUBJECT,        
        (SELECT COUNT(1) 
            from EXAMS
          where GRADE IN (9,10) 
            AND SUBJECT = EXA.SUBJECT 
            AND EXAM_DATE = EXA.EXAM_DATE) outstanding,
        (select count(1)
            from EXAMS 
          where GRADE IN (4,5,6,7,8) 
            AND SUBJECT = EXA.SUBJECT 
            AND EXAM_DATE = EXA.EXAM_DATE) approved,
        (select count(1)
            from EXAMS
          where GRADE IN (0,1,2,3) 
            AND SUBJECT = EXA.SUBJECT 
            AND EXAM_DATE = EXA.EXAM_DATE) disapproved,
FROM EXAMS EXA
GROUP BY EXAM_DATE,SUBJECT;

谢谢

只需使用条件聚合。不需要子查询:

select EXAM_DATE, SUBJECT,        
       SUM(GRADE IN (9,10) THEN 1 ELSE 0 END) as outstanding,
       SUM(GRADE IN (4,5,6,7,8) THEN 1 ELSE 0 END) as approved,
       SUM(GRADE IN (0,1,2,3) THEN 1 ELSE 0 END) as disapproved,
FROM EXAMS EXA
GROUP BY EXAM_DATE, SUBJECT;

只需使用条件聚合。不需要子查询:

select EXAM_DATE, SUBJECT,        
       SUM(GRADE IN (9,10) THEN 1 ELSE 0 END) as outstanding,
       SUM(GRADE IN (4,5,6,7,8) THEN 1 ELSE 0 END) as approved,
       SUM(GRADE IN (0,1,2,3) THEN 1 ELSE 0 END) as disapproved,
FROM EXAMS EXA
GROUP BY EXAM_DATE, SUBJECT;

只需使用条件聚合。不需要子查询:

select EXAM_DATE, SUBJECT,        
       SUM(GRADE IN (9,10) THEN 1 ELSE 0 END) as outstanding,
       SUM(GRADE IN (4,5,6,7,8) THEN 1 ELSE 0 END) as approved,
       SUM(GRADE IN (0,1,2,3) THEN 1 ELSE 0 END) as disapproved,
FROM EXAMS EXA
GROUP BY EXAM_DATE, SUBJECT;

只需使用条件聚合。不需要子查询:

select EXAM_DATE, SUBJECT,        
       SUM(GRADE IN (9,10) THEN 1 ELSE 0 END) as outstanding,
       SUM(GRADE IN (4,5,6,7,8) THEN 1 ELSE 0 END) as approved,
       SUM(GRADE IN (0,1,2,3) THEN 1 ELSE 0 END) as disapproved,
FROM EXAMS EXA
GROUP BY EXAM_DATE, SUBJECT;

我可能会使用一个轴来获得结果,因为您正在将列中的值(gradeNumber)转换为行中的值(gradeNumber的计数)。试试这个:

-- make and fill an example table
DECLARE @Exams TABLE
( Exam_Date     DATE
 ,[Subject]     VARCHAR(250)
 ,GradeNumber   INT)

INSERT @Exams VALUES ('2014-01-15','Escapology',1)
INSERT @Exams VALUES ('2014-01-15','Escapology',9)
INSERT @Exams VALUES ('2014-01-15','Escapology',5)
INSERT @Exams VALUES ('2014-01-15','Escapology',3)
INSERT @Exams VALUES ('2014-01-16','Art',8)
INSERT @Exams VALUES ('2014-01-16','Art',7)
INSERT @Exams VALUES ('2014-01-16','Chemistry',0)
INSERT @Exams VALUES ('2014-01-16','Chemistry',5)
INSERT @Exams VALUES ('2014-01-16','Chemistry',9)
INSERT @Exams VALUES ('2014-01-16','Chemistry',2)
INSERT @Exams VALUES ('2014-01-17','Maths',5)
INSERT @Exams VALUES ('2014-01-17','Maths',6)
INSERT @Exams VALUES ('2014-01-18','Geology',10)

-- set up the grade boundaries
DECLARE @A INT = 9
DECLARE @B INT = 4
DECLARE @C INT = 0

-- get the count of grades by exam and date
SELECT * FROM
(SELECT
     Exam_Date
     -- list the exam date twice as one will be used to make the count
    ,Exam_Date  AS ExamDate
    ,[Subject]
    ,CASE WHEN GradeNumber >= @A THEN 'Outstanding'
        WHEN GradeNumber >= @B THEN 'Approved'
        ELSE 'Disapproved' END AS Result
FROM @Exams) AS Up
PIVOT (COUNT(Exam_Date) FOR Result IN ([Outstanding],[Approved],[Disapproved])) AS PVT

我可能会使用一个轴来获得结果,因为您正在将列中的值(gradeNumber)转换为行中的值(gradeNumber的计数)。试试这个:

-- make and fill an example table
DECLARE @Exams TABLE
( Exam_Date     DATE
 ,[Subject]     VARCHAR(250)
 ,GradeNumber   INT)

INSERT @Exams VALUES ('2014-01-15','Escapology',1)
INSERT @Exams VALUES ('2014-01-15','Escapology',9)
INSERT @Exams VALUES ('2014-01-15','Escapology',5)
INSERT @Exams VALUES ('2014-01-15','Escapology',3)
INSERT @Exams VALUES ('2014-01-16','Art',8)
INSERT @Exams VALUES ('2014-01-16','Art',7)
INSERT @Exams VALUES ('2014-01-16','Chemistry',0)
INSERT @Exams VALUES ('2014-01-16','Chemistry',5)
INSERT @Exams VALUES ('2014-01-16','Chemistry',9)
INSERT @Exams VALUES ('2014-01-16','Chemistry',2)
INSERT @Exams VALUES ('2014-01-17','Maths',5)
INSERT @Exams VALUES ('2014-01-17','Maths',6)
INSERT @Exams VALUES ('2014-01-18','Geology',10)

-- set up the grade boundaries
DECLARE @A INT = 9
DECLARE @B INT = 4
DECLARE @C INT = 0

-- get the count of grades by exam and date
SELECT * FROM
(SELECT
     Exam_Date
     -- list the exam date twice as one will be used to make the count
    ,Exam_Date  AS ExamDate
    ,[Subject]
    ,CASE WHEN GradeNumber >= @A THEN 'Outstanding'
        WHEN GradeNumber >= @B THEN 'Approved'
        ELSE 'Disapproved' END AS Result
FROM @Exams) AS Up
PIVOT (COUNT(Exam_Date) FOR Result IN ([Outstanding],[Approved],[Disapproved])) AS PVT

我可能会使用一个轴来获得结果,因为您正在将列中的值(gradeNumber)转换为行中的值(gradeNumber的计数)。试试这个:

-- make and fill an example table
DECLARE @Exams TABLE
( Exam_Date     DATE
 ,[Subject]     VARCHAR(250)
 ,GradeNumber   INT)

INSERT @Exams VALUES ('2014-01-15','Escapology',1)
INSERT @Exams VALUES ('2014-01-15','Escapology',9)
INSERT @Exams VALUES ('2014-01-15','Escapology',5)
INSERT @Exams VALUES ('2014-01-15','Escapology',3)
INSERT @Exams VALUES ('2014-01-16','Art',8)
INSERT @Exams VALUES ('2014-01-16','Art',7)
INSERT @Exams VALUES ('2014-01-16','Chemistry',0)
INSERT @Exams VALUES ('2014-01-16','Chemistry',5)
INSERT @Exams VALUES ('2014-01-16','Chemistry',9)
INSERT @Exams VALUES ('2014-01-16','Chemistry',2)
INSERT @Exams VALUES ('2014-01-17','Maths',5)
INSERT @Exams VALUES ('2014-01-17','Maths',6)
INSERT @Exams VALUES ('2014-01-18','Geology',10)

-- set up the grade boundaries
DECLARE @A INT = 9
DECLARE @B INT = 4
DECLARE @C INT = 0

-- get the count of grades by exam and date
SELECT * FROM
(SELECT
     Exam_Date
     -- list the exam date twice as one will be used to make the count
    ,Exam_Date  AS ExamDate
    ,[Subject]
    ,CASE WHEN GradeNumber >= @A THEN 'Outstanding'
        WHEN GradeNumber >= @B THEN 'Approved'
        ELSE 'Disapproved' END AS Result
FROM @Exams) AS Up
PIVOT (COUNT(Exam_Date) FOR Result IN ([Outstanding],[Approved],[Disapproved])) AS PVT

我可能会使用一个轴来获得结果,因为您正在将列中的值(gradeNumber)转换为行中的值(gradeNumber的计数)。试试这个:

-- make and fill an example table
DECLARE @Exams TABLE
( Exam_Date     DATE
 ,[Subject]     VARCHAR(250)
 ,GradeNumber   INT)

INSERT @Exams VALUES ('2014-01-15','Escapology',1)
INSERT @Exams VALUES ('2014-01-15','Escapology',9)
INSERT @Exams VALUES ('2014-01-15','Escapology',5)
INSERT @Exams VALUES ('2014-01-15','Escapology',3)
INSERT @Exams VALUES ('2014-01-16','Art',8)
INSERT @Exams VALUES ('2014-01-16','Art',7)
INSERT @Exams VALUES ('2014-01-16','Chemistry',0)
INSERT @Exams VALUES ('2014-01-16','Chemistry',5)
INSERT @Exams VALUES ('2014-01-16','Chemistry',9)
INSERT @Exams VALUES ('2014-01-16','Chemistry',2)
INSERT @Exams VALUES ('2014-01-17','Maths',5)
INSERT @Exams VALUES ('2014-01-17','Maths',6)
INSERT @Exams VALUES ('2014-01-18','Geology',10)

-- set up the grade boundaries
DECLARE @A INT = 9
DECLARE @B INT = 4
DECLARE @C INT = 0

-- get the count of grades by exam and date
SELECT * FROM
(SELECT
     Exam_Date
     -- list the exam date twice as one will be used to make the count
    ,Exam_Date  AS ExamDate
    ,[Subject]
    ,CASE WHEN GradeNumber >= @A THEN 'Outstanding'
        WHEN GradeNumber >= @B THEN 'Approved'
        ELSE 'Disapproved' END AS Result
FROM @Exams) AS Up
PIVOT (COUNT(Exam_Date) FOR Result IN ([Outstanding],[Approved],[Disapproved])) AS PVT

你对表演有什么问题?你对表演有什么问题?你对表演有什么问题?你对表演有什么问题?我看到我的解决方案被标记为答案,但看过Gordon的,我会采用他的,比我简单得多的方法,虽然我肯定会参数化等级边界,所以使用。。。未付金额(等级号>=@A时为1,否则为0结束时为1)。。。等等。我看到我的解决方案被标记为答案,但看过Gordon的,我会采用他的,比我简单得多的方法,虽然我肯定会参数化等级边界,所以使用。。。未付金额(等级号>=@A时为1,否则为0结束时为1)。。。等等。我看到我的解决方案被标记为答案,但看过Gordon的,我会采用他的,比我简单得多的方法,虽然我肯定会参数化等级边界,所以使用。。。未付金额(等级号>=@A时为1,否则为0结束时为1)。。。等等。我看到我的解决方案被标记为答案,但看过Gordon的,我会采用他的,比我简单得多的方法,虽然我肯定会参数化等级边界,所以使用。。。未付金额(等级号>=@A时为1,否则为0结束时为1)。。。等等