mardi 5 mai 2015

MYSQL joining subquery issue

I have one table that has people's grades in it.

+---------+--------+--------+--------+---------------------+
|  name   | grade1 | grade2 | grade3 |      datetime       |
+---------+--------+--------+--------+---------------------+
| person1 |     50 |     80 |    100 | 2015-05-05 12:00:00 |
| person1 |     60 |     43 |     88 | 2015-05-05 12:00:00 |
| person1 |     11 |     80 |     44 | 2015-05-05 12:00:00 |
| person1 |     64 |     75 |     37 | 2015-05-05 12:00:00 |
| person1 |     83 |     34 |     99 | 2015-05-05 12:00:00 |
| person2 |     45 |    100 |     95 | 2015-05-05 12:00:00 |
| person2 |     76 |     75 |     54 | 2015-05-05 12:00:00 |
| person2 |     68 |     53 |     66 | 2015-05-05 12:00:00 |
| person2 |     45 |     12 |     85 | 2015-05-05 12:00:00 |
| person2 |     75 |     78 |     55 | 2015-05-05 12:00:00 |
+---------+--------+--------+--------+---------------------+

What I need to do is pull a person's grades for a specific day and then a string representing their pass/fail report from previous (up to 7) days.

The final result I would be looking for based off the table would be something like this:

+---------------+---------+--------+--------+--------+----------------+
|    report     |  name   | grade1 | grade2 | grade3 |    datetime    |
+---------------+---------+--------+--------+--------+----------------+
| pass:3 fail:2 | person1 |     50 |     80 |    100 | 5/5/2015 12:00 |
| pass:2 fail:3 | person2 |     42 |    100 |     95 | 5/5/2015 12:00 |
+---------------+---------+--------+--------+--------+----------------+

So my sql to get the first part is pretty simple:

SELECT *
FROM Grades.grade_table gt
WHERE gt.datetime = '2015-05-05 12:00:00'

The second part of my query looks like this:

SELECT CONCAT('fail:',SUM(CASE WHEN pass_fail = 'fail' THEN 1 ELSE 0 END),' pass:',SUM(CASE WHEN pass_fail = 'pass' THEN 1 ELSE 0 END)) trend_data
FROM (
    SELECT
    CASE
        WHEN ((grade1+grade2+grade3)/3) >= 65 THEN 'pass'
        ELSE 'fail'
    END AS pass_fail
    FROM Grades.grade_table gt
    WHERE gt.name = 'person1'
    LIMIT 7
) trend_data

What I've tried:

SELECT 
(
  SELECT CONCAT('fail:',SUM(CASE WHEN pass_fail = 'fail' THEN 1 ELSE 0 END),' pass:',SUM(CASE WHEN pass_fail = 'pass' THEN 1 ELSE 0 END)) trend_data
  FROM (
    SELECT
    CASE
      WHEN ((grade1+grade2+grade3)/3) >= 65 THEN 'pass'
      ELSE 'fail'
    END AS pass_fail
    FROM Grades.grade_table gt
    WHERE gt.name = original_data.name
    LIMIT 7
  ) trend_data
) AS trending_data, original_data.*
FROM
(
  SELECT *
  FROM Grades.grade_table gt
  WHERE gt.datetime = '2015-05-05 12:00:00'
)

I keep getting cant find original_data.name in where clause, but I thought that would come through since it's in a separate select which is aliased.

Aucun commentaire:

Enregistrer un commentaire