Jens Hopp: Frage zu SQL-Formulierung

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

  1. 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