Guest User

Untitled

a guest
Aug 16th, 2018
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.62 KB | None | 0 0
  1. Optimization of multiple aggregations in SELECT
  2. CREATE TABLE Student (
  3. ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
  4. Name NVARCHAR(255) NOT NULL
  5. );
  6.  
  7. CREATE TABLE Grade (
  8. ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
  9. StudentID INT NOT NULL FOREIGN KEY REFERENCES Student(ID),
  10. Score INT NOT NULL,
  11. CONSTRAINT CK_Grade_Score CHECK (Score >= 0 AND Score <= 100)
  12. );
  13.  
  14. INSERT INTO Student (Name) VALUES ('Steven');
  15. INSERT INTO Student (Name) VALUES ('Timmy');
  16. INSERT INTO Student (Name) VALUES ('Maria');
  17.  
  18. INSERT INTO Grade (StudentID, Score) VALUES (1, 90);
  19. INSERT INTO Grade (StudentID, Score) VALUES (1, 81);
  20. INSERT INTO Grade (StudentID, Score) VALUES (1, 82);
  21. INSERT INTO Grade (StudentID, Score) VALUES (1, 82);
  22.  
  23. INSERT INTO Grade (StudentID, Score) VALUES (2, 99);
  24. INSERT INTO Grade (StudentID, Score) VALUES (2, 63);
  25. INSERT INTO Grade (StudentID, Score) VALUES (2, 97);
  26. INSERT INTO Grade (StudentID, Score) VALUES (2, 90);
  27.  
  28. INSERT INTO Grade (StudentID, Score) VALUES (3, 66);
  29. INSERT INTO Grade (StudentID, Score) VALUES (3, 61);
  30. INSERT INTO Grade (StudentID, Score) VALUES (3, 60);
  31.  
  32. SELECT Name,
  33. (SELECT AVG(Score) FROM Grade WHERE StudentID = Student.ID AND Score < 65) AS 'F',
  34. (SELECT AVG(Score) FROM Grade WHERE StudentID = Student.ID AND Score >= 65 AND Score < 70) AS 'D',
  35. (SELECT AVG(Score) FROM Grade WHERE StudentID = Student.ID AND Score >= 70 AND Score < 80) AS 'C',
  36. (SELECT AVG(Score) FROM Grade WHERE StudentID = Student.ID AND Score >= 80 AND Score < 90) AS 'B',
  37. (SELECT AVG(Score) FROM Grade WHERE StudentID = Student.ID AND Score >= 90 AND Score <= 100) AS 'A'
  38. FROM Student
  39.  
  40. Name F D C B A
  41. -----------------------------------------
  42. Steven NULL NULL NULL 81 90
  43. Timmy 63 NULL NULL NULL 95
  44. Maria 60 66 NULL NULL NULL
  45.  
  46. SELECT st.name,
  47. avg(CASE WHEN g.score < 65 THEN g.score ELSE NULL END) as F,
  48. avg(CASE WHEN g.score >= 65 AND g.score < 70 THEN g.score ELSE NULL END) as D,
  49. avg(CASE WHEN g.score >= 70 AND g.score < 80 THEN g.score ELSE NULL END) as C,
  50. avg(CASE WHEN g.score >= 80 AND g.score < 90 THEN g.score ELSE NULL END) as B,
  51. avg(CASE WHEN g.score >= 90 AND g.score <= 100 THEN g.score ELSE NULL END) as A
  52. FROM Grade g
  53. JOIN Student st ON g.studentid = st.ID
  54. GROUP BY st.name
  55.  
  56. ;WITH
  57. Scores(ID,Score) AS(
  58. SELECT S.ID,AVG(Score)
  59. FROM Student S
  60. JOIN Grade G
  61. ON S.ID = G.StudentID
  62. GROUP BY S.ID)
  63.  
  64. SELECT ST.Name
  65. ,CASE WHEN S.Score < 65 THEN S.Score ELSE NULL END AS 'F'
  66. ,CASE WHEN S.Score BETWEEN 65 AND 70 THEN S.Score ELSE NULL END AS 'D'
  67. ,CASE WHEN S.Score BETWEEN 70 AND 80 THEN S.Score ELSE NULL END AS 'C'
  68. ,CASE WHEN S.Score BETWEEN 80 AND 90 THEN S.Score ELSE NULL END AS 'B'
  69. ,CASE WHEN S.Score BETWEEN 90 AND 100 THEN S.Score ELSE NULL END AS 'A'
  70. FROM Scores S
  71. JOIN Student ST
  72. ON S.ID = ST.ID
  73.  
  74. SELECT s.Name
  75. ,SUM(CASE Score_g WHEN 'F' THEN Score_avg END) as 'F'
  76. ,SUM(CASE Score_g WHEN 'D' THEN Score_avg END) as 'D'
  77. ,SUM(CASE Score_g WHEN 'C' THEN Score_avg END) as 'C'
  78. ,SUM(CASE Score_g WHEN 'B' THEN Score_avg END) as 'B'
  79. ,SUM(CASE Score_g WHEN 'A' THEN Score_avg END) as 'A'
  80. FROM Student s,
  81. (
  82. SELECT StudentId, score_g, avg(score) as score_avg
  83. FROM (
  84. SELECT StudentID, Score
  85. CASE
  86. WHEN Score < 65 THEN 'F'
  87. WHEN Score >= 65 AND Score < 70 THEN 'D'
  88. WHEN Score >= 70 AND Score < 80 THEN 'C'
  89. WHEN Score >= 80 AND Score < 90 THEN 'B'
  90. WHEN Score >= 90 AND Score <= 100 THEN 'A'
  91. ELSE 'X'
  92. END AS Score_g
  93. FROM Grade
  94. ) g
  95. GROUP BY StudentId, score_g
  96. ) t
  97. WHERE s.ID = t.StudentID
  98. GROUP BY s.Name
  99.  
  100. SELECT s.name
  101. ,AVG(CASE WHEN Score < 65 THEN SCORE END) AS 'F'
  102. ,AVG(CASE WHEN Score >= 65 AND Score < 70 THEN SCORE END) AS 'D'
  103. ,AVG(CASE WHEN Score >= 70 AND Score < 80 THEN SCORE END) AS 'C'
  104. ,AVG(CASE WHEN Score >= 80 AND Score < 90 THEN SCORE END) AS 'B'
  105. ,AVG(CASE WHEN Score >= 90 AND Score <= 100 THEN SCORE END) AS 'A'
  106. FROM Grade g, Student s
  107. WHERE g.StudentID = s.ID
  108. GROUP BY s.name
  109.  
  110. ;WITH marked AS (
  111. SELECT
  112. StudentID,
  113. Score,
  114. Mark = CASE
  115. WHEN Score < 65 THEN 'F'
  116. WHEN Score < 70 THEN 'D'
  117. WHEN Score < 80 THEN 'C'
  118. WHEN Score < 90 THEN 'B'
  119. ELSE 'A'
  120. END
  121. FROM Grade
  122. ),
  123. pivoted AS (
  124. SELECT
  125. StudentID,
  126. F, D, C, B, A
  127. FROM marked m
  128. PIVOT (
  129. AVG(Score) FOR Mark IN (F, D, C, B, A)
  130. ) p
  131. )
  132. SELECT
  133. s.Name,
  134. p.F,
  135. p.D,
  136. p.C,
  137. p.B,
  138. p.A
  139. FROM Student s
  140. INNER JOIN pivoted p ON s.ID = p.StudentID
Add Comment
Please, Sign In to add comment