Frage zu SQL-Formulierung
Jens Hopp
- datenbank
0 Vimes
Hallo.
Ich habe eine Frage zu SQL.
Für eine Umsatztabelle brauche ich folgende Darstellung, in der die Stückzahlen, Umsatz und Erlöse für verschiedene Produkte in verschiedenen Monaten nacheinander dargestellt werden.
+-----------+--------------------------------------------------------------------------------+-- ... --+--------- ...
| | 2003 | 2004
+-----------+--------------------------+--------------------------+--------------------------+-- ... --+-------- ...
| | Januar | Februar | März | | Januar
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-- ... --+--------+ ...
| | Stück | Umsatz | Erlös | Stück | Umsatz | Erlös | Stück | Umsatz | Erlös | | Stück |
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-- ... --+--------+ ...
| Produkt A | 243 | 672 E | 162 E | 354 | 723 E | 189 E | 245 | 678 E | 145 E | | 352 |
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-- ... --+--------+ ...
| Produkt B | 547 | 243 E | 132 E | 765 | 254 E | 140 E | 645 | 356 E | 123 E | | 567 |
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-- ... --+--------+ ...
| Produkt C | 243 | 672 E | 162 E | 354 | 723 E | 189 E | 245 | 678 E | 145 E | | 352 |
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-- ... --+--------+ ...
...
...
...
Es gibt folgende Tabellen:
-"Jahr" mit Spalte "Jahreszahl"
-"Monat" mit Spalte "Monat" und Key zum "Jahr"
-"Produkt" mit Spalte "Bezeichnung"
-"Monatsumsatz" mit Spalte "Stückzahl", "Erlös", "Umsatz" und Keys zu "Produkt" -und zu "Monat"
Letztlich handelt es sich also für jeden Monat um eine eigene Abfrage über die Tabelle "Monatsumsatz" in der Form
select * from Monatsumsatz where KeyMonat=[Monat]
Die Ergebnisse dieser Abfragen müssten dann nacheinander dargestellt werden - eine Frage des Templates.
Ich müsste also mehrere Abfragen aneinanderhängen, für Januar 2003, für Februar 2003, für März 2003 u.s.w..
Wenn ich aber das nun noch auswählbar machen will:
Januar 2003 bis Juni 2003
oder
Januar 2004 bis März 2004
oder so
bekomme ich ein Problem mit der Darstellung und der Anzahl der notwendigen Abfragen - weil das variabel sein muß.
Muß ich mit dem Problem leben oder gibt es irgendeine tolle SQL-Lösung (Subselects, Joins, was-weiß-ich), mit der solche verschachtelten Anfragen standardmäßig gelöst werden?
Oder ist diese Problemlage die, weshalb man Objektorientierte Datenbanken entwickelt? (Womit ich das endlich verstehen würde... ;-)
Danke für ein paar Tips, Gedankenanregungen - vielleicht nur ein paar Keywords zum weitergoogeln.
viele Grüße
Jens-H. Hopp
Moin,
Mit UNION kannst du mehrere Abfragen aneinander kleben.
Soweit ich dein Problem aber verstanden habe, willst du aus der Tabelle Monatsumsatz einzelne Datensätze selektieren.
Was spricht also gegen
SELECT * FROM Monatsumsatz where (KeyMonat BETWEEN Key_für_Januar AND Key_für Juni) AND Jahr=Key_für_2003
SQL-Vergleichoperatoren siehe http://www.mysql.de/doc/de/Comparison_Operators.html
Willst du statt/(zusätzlich zu) den Keys die eigentlichen Bezeichnungen nehmen, mußt du JOIN's verwenden
SELECT Monat.*, MU.* FROM Monatsumsatz AS MU INNER JOIN Monat ON Monat.Monat=MU.MonatKey where (MU.Monat BETWEEN Key_für_Januar AND Key_für Juni) AND MU.Jahr=Key_für_2003
Mit AS kannst du Aliase definieren, die die Schreibweise etwas verkürzen.
Aggregierte Werte, also z.B. den Monatsumsatz gibt es mit SUM und GROUP BY, also
SELECT Monat,SUM(Erlös) FROM Monatsumsatz GROUP BY Monat
obwohl ich hier nicht sicher bin, dass sich SQL mit dem ö nicht schwer tut.
so long