2016-07-12 12 views
0

Ich habe eine Tabelle mit den folgenden Spalten, die ich versuche, eine Ansicht zu erstellen, um einen Bericht zu erstellen, muss ich die Summe der absolvierten Stunden für eine bestimmte Klasse aber mit ein spezifischer Filter:Get Summe, mehrere Gruppen von mit Filter

| PK_CLASS_DAYS_ID | FK_MAIN_ID | FK_CLASS_ID | CLASS_DAY | OUTCOME | CLASS_DATE | HOURS | 
|------------------|------------|-------------|-----------|---------|------------|-------| 
| 1    | 27452  | 137   | 1   | *15  | 2015-11-15 | 8  | 
| 2    | 27452  | 137   | 2   | *15  | 2015-11-16 | 8  | 
| 3    | 27452  | 137   | 4   | *15  | 2015-11-18 | 8  | 
| 4    | 27452  | 137   | 5   | BS15 | 2015-11-19 | 8  | 
| 5    | 27452  | 2   | 1   | *16  | 2001-01-01 | 8  | 
| 6    | 27452  | 48   | 1   | *16  | 2016-01-12 | 8  | 
| 7    | 27452  | 48   | 2   | *16  | 2016-02-27 | 4  | 
| 8    | 27452  | 2   | 1   | *17  | 2017-07-01 | 8  | 
| 9    | 27452  | 137   | 1   | *16  | 2016-07-16 | 8  | 

ich brauche die Summe der Stunden für jede Klasse (FK_CLASS_ID) für jeden Schüler in meinem Tisch (zur Zeit habe ich gefiltert es zu ID 27452 für Testzwecke), während der Anwendung des folgenden Filters abgeschlossen finden für jede Klasse (FK_CLASS_ID):

  • (1) CLASS_DAY müssen
  • (2) CLASS_OUTCOME muss beginnen mit "*"
  • (3) CLASS_DATE muss die jüngste verschieden sein, während immer noch die beiden vorherigen Bedingungen aufweist. Die sich ergebende Ansicht sollte wie folgt lauten:
| PK_CLASS_DAYS_ID | FK_MAIN_ID | FK_CLASS_ID | Hrs | 
|------------------|-------------|--------------|------| 
| 1    | 27452  | 137   | 32 | 
| 2    | 27452  | 2   | 8 | 
| 3    | 27452  | 48   | 12 | 

Die am weitesten ich mit dem Versuch, dies zu tun bekommen haben, ist die folgende select-Anweisung:

SELECT 
t1.CLASS, 
SUM(class_hours) as Hrs, 
GROUP_CONCAT('D',classes_days.class_day) as DaysList, 
main.FULLNAME 
FROM 
classes t1 
INNER JOIN classes_days ON classes_days.FK_CLASS_ID = t1.CLASS_ID 
INNER JOIN main ON main.PK_MAIN_ID = classes_days.FK_MAIN_ID 
WHERE 
main.PK_MAIN_ID = 27452 
GROUP BY FK_CLASS_ID 
ORDER BY CLASS 
+0

Können Sie erklären, was das Problem mit Ihrer Aussage ist? – Mureinik

+1

Sie sollten beim Markieren vorsichtig sein. SQL Server <> MySQL. Ich würde die Tags bearbeiten, aber es gibt gerade eine ausstehende Bearbeitung. –

+0

Meine aktuelle Anweisung berücksichtigt weder die CLASS_DAY-Spalte noch das letzte Datum, wenn zwei Zeilen mit demselben CLASS_DAY für dieselbe FK_CLASS_ID vorhanden sind. Außerdem muss es nur Zeilen hinzufügen, bei denen die Spalte OUTCOME mit einem Stern beginnt. Dies ist für MySQL v5.6. – Gustavo1478

Antwort

0

Für das, was Sie wollen Um dies zu erreichen, müssten Sie Ihre Joins mit den gewünschten Summationsabfragen filtern und die Verknüpfung der gewünschten Kriterien aus dem abgerufenen Recordset bereitstellen.

Gründend es Ihre bereitgestellt Abfrage und die gewünschten Ergebnisse aus, sollte es wie folgt aussehen:

SELECT 
`t1`.`CLASS`, 
SUM(`class_hours`.`HOURS`) AS `Hrs`, 
GROUP_CONCAT('D', `class_hours`.`CLASS_DAY` ORDER BY `class_hours`.`CLASS_DAY`) AS `DaysList`, 
`main`.`FULLNAME` 
FROM `classes` AS `t1` 
INNER JOIN (
    #Filter the total hours by student, class, and day 
    SELECT `class_dates`.`FK_MAIN_ID`, `class_dates`.`CLASS_DAY`, `class_dates`.`FK_CLASS_ID`, SUM(`class_dates`.`HOURS`) as `HOURS` 
    FROM (
     #Filter Most Recent Days beginning with star, by most recent date 
     SELECT `classes_days`.* 
     FROM `classes_days` 
     WHERE `classes_days`.`OUTCOME` LIKE '*%' 
     ORDER BY `CLASS_DATE` DESC 
    ) AS `class_dates` 
    GROUP BY `class_dates`.`FK_MAIN_ID`, `class_dates`.`CLASS_DAY`, `class_dates`.`FK_CLASS_ID` 
) AS `class_hours` 
ON `class_hours`.`FK_CLASS_ID` = `t1`.`CLASS_ID` 
INNER JOIN `main` 
ON `main`.`PK_MAIN_ID` = `class_hours`.`FK_MAIN_ID` 
GROUP BY `class_hours`.`FK_MAIN_ID`, `class_hours`.`FK_CLASS_ID` 
ORDER BY `FULLNAME`, `CLASS`; 

In Resultierende:

| CLASS | Hrs | DaysList | FULLNAME | 
|---------|-----|-------------|----------| 
| History | 8 |   D1 |  Joe | 
| Math | 32 | D1,D2,D4 |  Joe | 
| Science | 12 |  D1,D2 |  Joe | 
| Math | 10 |  D1,D2 |  Mike | 

Beispiel: http://sqlfiddle.com/#!9/d5828/1

Original-Abfrage der Tabellen ist die oberste Abfrage. Das Unterabfrage-Join-Beispiel ist das Ergebnis der unteren Abfrage. Entfernt die PK_MAIN_ID Kriterien zeigen gegen mehrere Einträge Arbeits

im Auge behalten Sie, dass MySQL GROUP BY + ORDER BY hat ergeben nicht immer die gewünschten Ergebnisse, und sollte mit einer Unterabfrage werden gefiltert, die in der Join-Unterabfrage, um demonstriert um die neuesten Daten zu erhalten, die mit * beginnen.

+0

Wow! Diese Aussage sieht geladen aus, ich brauche etwas Zeit, um sie zu lesen und zu verstehen. Sobald ich es tue, werde ich es auf meine Situation anwenden und die Ergebnisse zurückmelden. Vielen Dank für Ihre Antwort, sehr geschätzt. – Gustavo1478

+0

Ich zwickte Ihre ursprüngliche Aussage, um mein gewünschtes Resultat zu erhalten, anstatt alle Aufzeichnungen in den #Filter den letzten Tagen beginnend mit Stern, durch das späteste Datum Abschnitt auszuwählen. Anstatt alle auszuwählen, habe ich bestimmte Spalten ausgewählt und DISTINCT verwendet. Funktioniert wie erwartet, danke.Obwohl ich denke, dass ich diese Aussage in verschiedene Ansichten aufteilen muss, damit es so funktioniert, wie ich es brauche. – Gustavo1478

+0

Ich konnte nicht anders, als zu bemerken, dass alle Felder in der Anweisung Single Quotes haben, gibt es einen Grund dafür? Macht es einen Unterschied? – Gustavo1478