SQL Abfrage: Bitte um Denkhilfe

77patriot77

Neuer Benutzer
Beiträge
3
Hallo,

ich würde mich um einen Denkanstoss zu folgender Frage freuen:

Tabelle "Konten"
ID | Kontenummer | Kontenbeschreibung
1 | 10 | Einzelkosten
2 | 20 | Kaufkosten
3 | 30 | Hilfskosten
4 | 40 | Selbstkosten


Tabelle "Kalkulation"
ID | Artikelnummer | Kontennummer | Kosten
1 | 1000 | 10 | 5
2 | 1000 | 20 | 7
3 | 2000 | 10 | 3
4 | 2000 | 20 | 4

Nun benötige ich ein Abfrage-Statement, dass mir zu jeder Kalkulation ALLE MÖGLICHEN Konten anzeigt und das zu jedem Artikel. Beispielergebnis:

Tabelle "Ergebnis"
ID | Artikelnummer | Kontennummer | Kosten
1 | 1000 | 10 | 5
2 | 1000 | 20 | 7
3 | 1000 | 30 | leer
4 | 1000 | 40 | leer
5 | 2000 | 10 | 3
6 | 2000 | 20 | 4
7 | 2000 | 30 | leer
8 | 2000 | 40 | leer

Ich hoffe, dass ich die Frage verständlich formuliert habe. Vielen Dank schonmal im Voraus.
 
Werbung:
In Deinem Model fehlt eigentlich noch eine Tabelle der möglichen Artikelnummern, und warum Du die id der Konten-Tabelle nicht als Foreign Key in der Kalkulation nutzt bleibt auch Dein Geheimniss.

Code:
test=*# \d konten;
  Tabelle »public.konten«
 Spalte |  Typ  | Attribute
--------+---------+-----------
 id  | integer | not null
 nu  | integer |
Indexe:
  "konten_pkey" PRIMARY KEY, btree (id)
Fremdschlüsselverweise von:
  TABLE "kalk" CONSTRAINT "kalk_konto_fkey" FOREIGN KEY (konto) REFERENCES konten(id)

test=*# \d kalk
  Tabelle »public.kalk«
 Spalte  |  Typ  | Attribute
---------+---------+-----------
 id  | integer | not null
 artikel | integer |
 konto  | integer |
 kosten  | integer |
Indexe:
  "kalk_pkey" PRIMARY KEY, btree (id)
Fremdschlüssel-Constraints:
  "kalk_konto_fkey" FOREIGN KEY (konto) REFERENCES konten(id)

test=*# select * from konten ;
 id | nu
----+----
  1 | 10
  2 | 20
  3 | 30
  4 | 40
(4 Zeilen)

test=*# select * from kalk ;
 id | artikel | konto | kosten
----+---------+-------+--------
  1 |  1000 |  1 |  5
  2 |  1000 |  2 |  7
  3 |  2000 |  1 |  3
  4 |  2000 |  2 |  4
(4 Zeilen)

test=*# select x.artikel, k.nu, kalk.kosten from konten k cross join (select distinct artikel from kalk) x left join kalk on (x.artikel,k.id)=(kalk.artikel, kalk.konto) order by artikel, nu;
 artikel | nu | kosten
---------+----+--------
  1000 | 10 |  5
  1000 | 20 |  7
  1000 | 30 |   
  1000 | 40 |   
  2000 | 10 |  3
  2000 | 20 |  4
  2000 | 30 |   
  2000 | 40 |   
(8 Zeilen)

test=*#
 
Vielen Dank für deine Hilfe. Wirklich super. Eine kurze Frage hätte ich noch, dann komme ich glaube ich wieder klar.

Ich will die Tabelle "kalk" um das Feld "gruppe" erweitern.

id | artikel | gruppe | konto | kosten
----+---------+-----------+--------
1 | 1000 verkauf | 1 | 5
2 | 1000 verkauf | 2 | 8
3 | 1000 einkauf | 1 | 1
4 | 1000 einkauf | 2 | 3
5 | 2000 verkauf | 2 | 9


Pro Artikel/Gruppe sollten dann alle möglichen Konten angezeigt werden, was ich bisher jedoch nicht hinbekommen habe.

Ergebnis sollte so aussehen:

id | artikel | gruppe | konto | kosten
----+---------+-----------+--------
1 | 1000 verkauf | 1 | 5
2 | 1000 verkauf | 2 | 8
3 | 1000 verkauf | 3 | leer
4 | 1000 verkauf | 4 | leer

5 | 1000 einkauf | 1 | 1
6 | 1000 einkauf | 2 | 3
7 | 1000 einkauf | 3 | leer
8 | 1000 einkauf | 4 | leer

9 | 2000 verkauf | 1 | leer
10 | 2000 verkauf | 2 | 9
11 | 2000 verkauf | 3 | leer
12 | 2000 verkauf | 4 | leer


Ist das Ergebnis in der From überhaupt möglich?
 
So sollte die Ergebnis-Tabelle aussehen. Habe die Trennzeichen vergessen einzufügen.

id | artikel | gruppe | konto | kosten
----+---------+-----------+--------
1 | 1000 | verkauf | 1 | 5
2 | 1000 |verkauf | 2 | 8
3 | 1000 |verkauf | 3 | leer
4 | 1000 |verkauf | 4 | leer

5 | 1000 |einkauf | 1 | 1
6 | 1000 |einkauf | 2 | 3
7 | 1000 |einkauf | 3 | leer
8 | 1000 |einkauf | 4 | leer

9 | 2000 |verkauf | 1 | leer
10 | 2000 |verkauf | 2 | 9
11 | 2000 |verkauf | 3 | leer
12 | 2000 |verkauf | 4 | leer
 
Werbung:
Die Antwort, wie das geht, hast Du sinngemäß schon erhalten. Wie viele Gruppen gibt es? Das führt dann letztlich wieder zu einem CROSS JOIN. Versuch zu verstehen, was ich gezeigt habe, und erweitere das auf die die Gruppen.
 
Zurück
Oben