Autor |
Beitrag |
D. Annies
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 27.05.06 08:22
Hi, Delpher,
Wie kann ich aus einer DBTabelle mit den Feldern WPK1, WPK2, WPK3
(WPK = Wahlpflichtkurs) die in allen drei Spalten einzigartigen Inhalte ausgegeben bekommen? Es gibt, sagen wir mal, 50 verschiedene WPK's. Davon werden aber nur 28 als erste Wahl genommen und 12 andere erst als zweite Wahl. Ich brauche also eine Gesamtliste aller genommenen WPK's, unabhängig, ob sie als erster, zweiter oder dritter WPK gewählt wurden.
Meine Idee select distinct WPK1, WPK2, WPK3 from Tab funzt nicht so, wie gewünscht.
Wer weiß denn Rat? Vielen Dank für Hilfe, sagt
Detlef Annies
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Sa 27.05.06 09:28
SQL-Anweisung 1: 2: 3: 4: 5: 6: 7:
| select distinct wpk from (select wpk1 as wpk from tabelle union select wpk2 from tabelle union select wpk3 from tabelle ) |
_________________ Na denn, dann. Bis dann, denn.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 27.05.06 10:58
Hi, alzaimer,
du bist der BRINGER!
(gut, dass du dich an diesen Befehl noch erinnern konntest ...  )
Ich danke dir!
Gruß aus Lübeck,
Detlef
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 27.05.06 13:31
Autsch,
leider funzt der Befehl nicht. Fehlermeldung:
Ungültiges Schlüsselwort select in Zeile 1
Gruß, Detlef
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Sa 27.05.06 13:51
Im Statement waren 2 kleine Flüchtigkeitsfehler, so ist es richtig:
SQL-Anweisung 1: 2: 3: 4: 5: 6: 7:
| select distinct wpk from (select wpk1 as wpk from tabelle union select wpk2 as wpk from tabelle union select wpk3 as wpk from tabelle ) |
Dein Problem liegr aber möglichweise am verwendeten Datenbanksystem. Nicht alle DBMS unterstützen derived-queries.
Was für ein DBMS setzt du ein?
_________________ Markus Kinzler.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Sa 27.05.06 14:35
Bei MSSQL muss man den Spaltennamen einer UNION nur im ersten SELECT angeben, dachte ich zumindest.
Bei MSSQL (eben ausprobiert) ist das distinct übrigens bei einem union implizit, wird also sowieso ausgeführt. Mit anderen Worten: Das hier reicht:
SQL-Anweisung 1: 2: 3: 4: 5:
| select wpk1 as wpk from Tabelle union select wpk2 from Tabelle union select wpk3 from Tabelle |
_________________ Na denn, dann. Bis dann, denn.
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Sa 27.05.06 14:47
In MSSql kenn ich mich nicht so aus. Meine Variante sollte eigentlich auf allen DBMS gehen, soweit sie derived-queries unterstützen, was hier nicht der Fall zu sein scheint.
_________________ Markus Kinzler.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Sa 27.05.06 16:14
Hallo Markus und alzaimer,
in der Tat musste ich die Klammer weglassen, an das andere dachte ich auch schon.
Eure Ersatzvorschläge werde ich auch mal durchlaufen lassen.
Eine Zusatzfrage habe ich, sonst muss ich evtl. einen neuen Thread machen:
Wie kann ich die Anzahl der Personen, die den jeweiligen WPK gewählt haben, zählen?
Das DataBaseManagementSystem kenne ich nicht, ich schreibe den Befehl direkt in den Quellcode, bzw. lese ihn in den Inputstring aus einer Textdatei. Wer weiß den damit, was ich für ein DBMS habe?
Vielen Dank für weitere Hilfe und Grüße aus Lübeck,
Detlef
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Sa 27.05.06 16:49
DBMS: MSSql, FireBird, PostGres, DB2, Oracle, Paradox, usw.
So oder ähnlich sollte die Erweiterung aussehen:
SQL-Anweisung 1: 2: 3: 4: 5: 6: 7:
| select wpk, sum(wpk) from ( select wkp1 as wpk, count(wpk1) as anz from tabelle group by wpk1 union select wkp2 as wpk, count(wpk2) an anz from tabelle group by wpk2 union select wkp3 as wpk, count(wpk1) as anz from tabelle group by wpk3) group by wpk |
_________________ Markus Kinzler.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: So 28.05.06 09:46
Hi, Markus,
sorry, dass ich erst jetzt antworten kann, dein Befehl funzt so (oder so ähnlich) ganz gut. Ich muss allerdings die Klammern weglassen.
Ich sehe jetzt: Es gibt 4 Teilnehmer, die Delphi als WPK1 gewählt haben und 8 TN als WPK2 und 6 TN als WPK3.
Ich möchte sehen: es sind 18 TN, die Delphi (oder einen anderen WPK) überhaupt gewählt haben:
Geht das auch?
Grüße von
Detlef
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: So 28.05.06 10:05
Welche Klammer hast du weggelassen? welches DBMS setzt du ein?
Eigentlich sollte meine Abfrage einen Dataensatz pro WPK bringen.
_________________ Markus Kinzler.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: So 28.05.06 10:13
Hi, Markus,
ich lasse aus deinem Befehl die Klammer aus Zeile 2 und aus Zeile 7 weg, sonst bekomme ich eine Fehlermeldung, die Klammer vor select wird dann angemeckert.
Mein DBMS ist dann wohl die BDE.
Grüße aus HL,
Detlef
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: So 28.05.06 10:28
Ich vermute mal das die BDE keine derived-queries kann
Trotzdem hier mal eine verkürzte Lösung.
SQL-Anweisung 1: 2: 3: 4: 5: 6: 7: 8:
| select wpk, count(wpk) from ( select wpk1 as wpk from tabelle union select wpk2 as wpk from tabelle union select wpk3 as wpk from tabelle ) group by wpk |
_________________ Markus Kinzler.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: So 28.05.06 11:50
Hi, Markus,
danke für deine schnelle Antwort!
Ist wohl leider so, dass die BDE das nicht kann
Muss ich mir halt nacheinander die Informationen besorgen!
Grüße von
Detlef Annies
|
|