1

万が一、私がテーブルを見せなくても、このクエリを最適化するのに役立つでしょうか。

これらのクエリのすべてが派生した元のテーブルには次の列があり、テーブルの名前はlaterec-studentsです。

--------------------------------------------------------------
| studentid | name  | class | latetime             | waived |
--------------------------------------------------------------
| ID1111STU  | Stu 1 | 1A   |2012-01-09 08:09:00   |Waived  |



SELECT A.class, NoStudentsLate, 1xLATE, 2xLATE FROM (

  SELECT 
         class, 
         count(DISTINCT studentid) AS NoStudentsLate
    FROM `laterec-students` 
   WHERE waived!="Waived" 
   GROUP BY class

) AS A 
LEFT JOIN (

  SELECT class, count(distinct studentid) AS 1xLATE from (
       SELECT `laterec-students`.class, `laterec-students`.studentid
         FROM `laterec-students` 
        WHERE waived!="Waived"
        GROUP BY studentid
       HAVING count(studentid)=1) as temp 
  GROUP BY class
) AS B ON A.class=B.class

LEFT JOIN (
  SELECT class, count(distinct studentid) AS 2xLATE from (
    SELECT `laterec-students`.class, `laterec-students`.studentid
      FROM `laterec-students` 
     WHERE waived!="Waived"
     GROUP BY studentid
    HAVING count(studentid)=2) as temp 
  GROUP BY class
) AS C ON A.class=C.class

これが私が達成しようとしていることです

---------------------------------------------------------------------
| Class | Total # of students late | # late 1 times | # late 2 times |
---------------------------------------------------------------------
| 1A    |    5                     |     3          |     2          |
| 1B    |    3                     |     3          |     0          |
---------------------------------------------------------------------

つまり、これが意味するのは、クラス1Aでは、学生IDを使用して数えた場合、合計5人の学生が遅れているということです。この5人のうち、3人の生徒が1回遅れ、2人の生徒が2回遅れています。

再びクラス1Bでは、合計3人の生徒が遅れており、全員が1回だけ遅れています。

4

1 に答える 1

3

あなたのクエリを理解できたことを願っていますが、次は私のSQL Fiddle exampleで機能します。

SELECT
  class,
  SUM(cnt > 0) AS NoStudentsLate,
  SUM(cnt = 1) AS 1xLate,
  SUM(cnt = 2) AS 2xLate
FROM
(
  SELECT class, studentid, COUNT(*) AS cnt
  FROM `laterec-students`
  WHERE waived!='Waived'
  GROUP BY class, studentid
) t
GROUP BY class;
于 2012-06-13T12:07:10.120 に答える