verwenden Sie sql ausgewählten Werte als Zeile Namen für einen anderen auswählen
Auf einen MSSQL-server, der die Tabellen:
TABLE values {
int id;
timestamp date;
int value;
}
TABLE value_type {
int value_id; // foreign key on values.id
text name;
}
Kann ich eine Abfrage wie:
SELECT date, name, value
FROM values
LEFT JOIN value_type ON value_id = id;
und bekommen so etwas wie:
+----------+------+-------+
| date | name | value |
+----------+------+-------+
| 01.01.10 | foo | 1.0 |
+----------+------+-------+
| 01.01.10 | bar | 2.0 |
+----------+------+-------+
| 02.01.10 | bar | 4.0 |
+----------+------+-------+
| 03.01.10 | foo | 5.0 |
+----------+------+-------+
Was ist der effizienteste Weg, um die Datenbank abzufragen, wenn ich mag würde, um die Daten so?
+----------+------+-------+
| date | foo | bar |
+----------+------+-------+
| 01.01.10 | 1.0 | 2.0 |
+----------+------+-------+
| 02.01.10 | NULL | 4.0 |
+----------+------+-------+
| 03.01.10 | 5.0 | NULL |
+----------+------+-------+
Die Struktur der Datenbank ist viel komplizierter, und leider kann ich es nicht ändern.
BEARBEITEN: Die Lösung sollte nicht verwendet foo
und bar
fest codierte Werte in der Abfrage.
- Welche version von SQL Server verwenden Sie?
- Es ist auf einem MS SQL Server 2008
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für SQL Server 2005+ können Sie dynamisches SQL verwenden und
PIVOT
.Könnte man
group by
Datum:Durch die Art und Weise, der foreign key, die ungewöhnlich scheint. Ich würde erwarten, dass ein
value_type
Spalte in dervalues
Tabelle, die nicht einevalue_id
Spalte in dervalues_type
Tisch! Es gibt viel mehr Werte, als Werte-Typen, richtig?EDIT: Es gibt keine Möglichkeit in SQL zu generieren, die eine variable Anzahl von Spalten, so werden Sie zu dem resort, meta-SQL oder dynamic SQL. Hier ist ein Beispiel:
Diese Drucke:
ungetestet: definieren Sie eine Ansicht, die Tabellen zu verknüpfen, auf die pk-fk-pair-Mädchen, und dann versuchen Sie so etwas wie dieses:
Hier müssen Sie wissen, den Bereich der möglichen Werte im Voraus.
Es flexibler ZU machen, Sie bauen konnte ein dynamisches case-Anweisung aus der unterschiedlichen Werte von "name" in einer gespeicherten Prozedur und den Aufruf von exec() auf dieses string.
Aktualisiert auf Basis der neuen Anforderungen:
Sie müssen entweder dynamisch generieren der SQL-Anweisung für die Abfrage oder wenn Sie laden Sie es in Ihre Anwendung könnten Sie transformieren die Daten aus Ihrem ursprünglichen Abfrage oder eine ähnliche Abfrage.