Alle Module zum Programm ausgeben lassen

lapadula

Aktiver Benutzer
Beiträge
33
Hallo, folgendes habe ich vor und hoffe jemand kann mir da weiterhelfen.

In der Tabelle Programme gibt es die Spalte "ProgrammBezeichnung", sowie die Spalte Modul1, Modul2, Modul3

Beispiel:

Programm A - ModulX - ModulY - ModulZ
Programm A - ModulX - NULL - NULL
Programm B - NULL - NULL - ModulX
Programm B - ModulZ - NULL - ModulY
Programm B - NULL - ModulX - NULL

Ich möchte jetzt z. B. zum Programm A alle zugeordneten Module ausgeben, wie stelle ich das an?
 
Werbung:
Hallo, folgendes habe ich vor und hoffe jemand kann mir da weiterhelfen.

In der Tabelle Programme gibt es die Spalte "ProgrammBezeichnung", sowie die Spalte Modul1, Modul2, Modul3

Beispiel:

Programm A - ModulX - ModulY - ModulZ
Programm A - ModulX - NULL - NULL
Programm B - NULL - NULL - ModulX
Programm B - ModulZ - NULL - ModulY
Programm B - NULL - ModulX - NULL

Ich möchte jetzt z. B. zum Programm A alle zugeordneten Module ausgeben, wie stelle ich das an?


SELECT * from Programme WHERE ProgrammBezeichnung like 'Programm A'
Vorrausgesetzt ProgrammBezeichnung ist varchar :)

Damit bekommst du alle Module und kannst diese dann rausfinden.
Falls du nur die Spalten anzeigen willst , die nicht NULL sind, also wo zum Programm ein Modul enthalten ist musst du mal einen Fragen der sich damit richtig auskennt.
Einfache Abfragen sind kein Problem, da bin ich aber schon syntaxmäßig überfragt :-P
 
Dein Tabellendesign ist Murks. Was machst Du, wenn mal ein viertes Modul dazukommt? Das das schwer abzufragen ist hast ja schon gemerkt.

Code:
test=*# select * from lapadula ;
 p | m1 | m2 | m3
---+----+----+----
 a | x  | y  | z
 b | z  |  | y
 b |  |  | x
 b |  | x  |
 a | x  |  |
(5 Zeilen)

test=*# select p, array_agg(distinct m) from (select p, m1 as m from lapadula where m1 is not null union all select p, m2 from lapadula where m2 is not null union all select p, m3 from lapadula where m3 is not null) foo group by p;
 p | array_agg
---+-----------
 a | {x,y,z}
 b | {x,y,z}
(2 Zeilen)

test=*#

besser wäre es, nur 2 Spalten zu machen: Programm und Modul. Das ist letztlich das, was mein inneres Select macht.
 
Ganz so einfach ist es nicht. Ich meine das eher in die Richtung:

Code:
select
       Programm
       strModul1,
       strModul2,
       strModul3, 
      
from tblProgramme

where Bezeichnung = 'ProgrammA'

AND strModul1 IS NOT NULL OR strModul1 <> ''
AND strModul2 IS NOT NULL OR strModul2 <> ''
AND strModul3 IS NOT NULL OR strModul3 <> ''

Das Problem dabei ist, dass er dabei die doppelten Programme ausgibt und doppelte Module.

Was ich möchte ist aber nur Programm A: ModulX, ModulY, ModulZ
 
Dein Tabellendesign ist Murks. Was machst Du, wenn mal ein viertes Modul dazukommt? Das das schwer abzufragen ist hast ja schon gemerkt.

Code:
test=*# select * from lapadula ;
p | m1 | m2 | m3
---+----+----+----
a | x  | y  | z
b | z  |  | y
b |  |  | x
b |  | x  |
a | x  |  |
(5 Zeilen)

test=*# select p, array_agg(distinct m) from (select p, m1 as m from lapadula where m1 is not null union all select p, m2 from lapadula where m2 is not null union all select p, m3 from lapadula where m3 is not null) foo group by p;
p | array_agg
---+-----------
a | {x,y,z}
b | {x,y,z}
(2 Zeilen)

test=*#

besser wäre es, nur 2 Spalten zu machen: Programm und Modul. Das ist letztlich das, was mein inneres Select macht.


Es wäre besser, da hast du recht. Ich habe die DB nicht entworfen und muss jetzt aber damit arbeiten.

Hier habe ich eine Abfrage, die mir alle Module zeigt, die es in der Tabelle gibt. Nun muss ich diese Module irgendwie einem vorhandenen Programm zuordnen

Code:
select distinct value

from tblProgramme
unpivot
(
  value
  for col in (strModul1, strModul2, strModul3, strModul4, strModul5, strModul6)
) un
order by value
 
Zuletzt bearbeitet:
Ok die Lösung für mein Problem:

Code:
select distinct value

from tblProgramme
unpivot
(
  value
  for col in (strModul1, strModul2, strModul3)
) un
where ProgrammBezeichnung = 'ProgrammA'
order by value
 
Code:
SELECT   DISTINCT t.Programm,t.Modul
FROM   (

SELECT   Programm,Modul1 AS Modul
FROM   tabelle
WHERE   Modul1 IS NOT NULL
UNION ALL
SELECT   Programm,Modul2 AS Modul
FROM   tabelle
WHERE   Modul2 IS NOT NULL
UNION ALL
SELECT   Programm,Modul3 AS Modul
FROM   tabelle
WHERE   Modul3 IS NOT NULL

     ) t
 
Danke, das funktioniert auch, ist nur mit etwas mehr Schreibaufwand verbunden, weil es 6 Module gibt :D Hab deinen Befehl aber mal als Kommentar im Quellcode hinzugefügt, falls man bei meiner Abfrage nicht drauf kommt, was dort gemacht wird.
 
Werbung:
Nunja, die erste Folge von verkorkstem Design ist immer Schreibaufwand. Dann kommen Performance Probleme, etc.

Es mag auch noch andere Wege geben (unpivot mag ich nicht, hab ich jetzt nicht probiert). So ist es zwar lang aber leicht verständlich.
 
Zurück
Oben