2010-12-28 11 views
1

Ich helfe einem kleinen ländlichen Gesundheitssystem, einige Datenbanken zu ihren Operationen hinzuzufügen. Sie verfolgen derzeit einige operative Statistiken, die sie vierteljährlich melden.Self Join, um vierteljährliche Daten aus derselben Tabelle zu vergleichen?

Ich möchte das Fleisch dieser Antworten in eine Tabelle legen und historische Vergleiche daraus machen. Ich werde einige zusätzliche Tabellen zur Normalisierung haben, aber hier ist die wichtigste.

+-------+----------+-------------+----------+ 
| year | quarter | question_id | response | 
+-------+----------+-------------+----------+ 
| 2000 | 1  | 100   | 50  | 
+-------+----------+-------------+----------+ 
| 2000 | 2  | 100   | 100  | 
+-------+----------+-------------+----------+ 
| 2000 | 1  | 200   | 75  | 
+-------+----------+-------------+----------+ 
| 2000 | 2  | 200   | 25  | 
+-------+----------+-------------+----------+ 

Die Ausgabe, die ich suche ist es, die vierteljährlich Antworten für jede Frage Seite an Seite zu setzen, so kann ich besser und einfach Verarbeitung meiner PHP Änderungen berechnen. Im Folgenden finden Sie die gewünschte Ausgabe:

+-------------+----------------------+----------------------+ 
| question_id | 1st quarter response | 2nd quarter response | 
+-------------+----------------------+----------------------+ 
| 100   | 50     | 100     | 
+-------------+----------------------+----------------------+ 
| 200   | 75     | 25     | 
+-------------+----------------------+----------------------+ 

ich SQL bin neu (mit MySQL 5) und das einzige, was ich denken kann, ist ich selbst müssen mitmachen. Ich habe es versucht, aber ich kann es nicht verstehen. Beziehe ich mich bei der Tabellenstruktur auf den richtigen Weg für diese Art von historischer Analyse?

Alle Hinweise wären eine große Hilfe und eine Hilfe für unser Projekt!

Danke!

Antwort

0

Nun vorausgesetzt, Sie möchten diese Ausgabe für ein bestimmtes Jahr, z. 2000:

SELECT 
    question_id, 
    (SELECT response FROM question_responses WHERE year = qr.year AND question_id = qr.question_id AND quarter = 1) AS qrt_resp_1, 
    (SELECT response FROM question_responses WHERE year = qr.year AND question_id = qr.question_id AND quarter = 2) AS qrt_resp_2 
    FROM question_responses AS qr 
    WHERE year = 2000 
    GROUP BY question_id 
1

Sie könnte group by Frage, und dann eine Kombination aus case und max verwenden, um die Antwort für dieses Quartal zu wählen.

select question_id 
,  max(case when quarter = 1 then question_responses end) as Q1 
,  max(case when quarter = 2 then question_responses end) as Q2 
,  max(case when quarter = 3 then question_responses end) as Q3 
,  max(case when quarter = 4 then question_responses end) as Q4 
from question_responses 
where year = 2000 
group by 
     question_id 

In diesem Beispiel wird die max nicht wirklich max nichts, es das einzige Viertel der Auswahl endet, für die der case einen Wert zurückgibt.

Verwandte Themen