Kreuztabelle / Kombinationen

FrenchSpirit

Aktiver Benutzer
Beiträge
41
Hallo in die Runde,

ich habe eine Tabelle mit allen Personen, die verschiedene Merkmale mit Ja oder Nein beantwortet haben. Als Abfrage möchte ich die Anzahl der Personen je Kombination erhalten. In Access würde ich hierzu eine Kreuztabelle nutzen. Geht das auch per SQL Statement?

Tabelle:

PERS_NR // MAIL // TELEFON
4711 // nein // nein
4612 // ja // ja
4813 // ja // nein
4914 // nein // ja

gewünschtes Ergebnis:

Kombination // Anzahl Personen
MAIL und Telefon nein // 1
MAIL Ja, tel nein // 1
Tel ja, Mail nein // 1
beides Ja //1


Mein Ansatz ist , mit CASE zu arbeiten:

sum (case when MAIL = 'n' and TELEFON = 'n'
then 1 else 0 end) as ANZAHL_BEIDESNEIN


Ich stehe aber auf dem Schaluch, wie ich das dann gruppieren kann??

Danke vorab für jede Hilfe.

Gruß
Spirit
 
Werbung:
Code:
test=*# select * from foo;
 pers_nr | mail | telefon
---------+------+---------
    4711 | f    | f
    4612 | t    | t
    4813 | t    | f
    4914 | f    | t
(4 rows)

test=*# select 'mail_nein_telefon_nein' as status, count(*) from foo where not mail and not telefon union all select 'mail_ja_telefon_nein', count(*) from foo where mail and not telefon;
         status         | count
------------------------+-------
 mail_nein_telefon_nein |     1
 mail_ja_telefon_nein   |     1
(2 rows)

test=*#

Du siehst, wie es weitergeht?
 
Perfekt, Danke!
Lass mich raten, ein automatisiertes finden aller möglichen Kombinationen kann SQL nicht?
Und vielleicht kannst du mir noch bei den JOINs von Dienstag helfen? Hoffe, ich bin nicht zu unverschämt ;)
 
Code:
test=*# select mail::text || ' ' || telefon::text as mail_telefon, count(1) from foo group by 1;
 mail_telefon | count
--------------+-------
 false true   |     1
 true true    |     1
 true false   |     1
 false false  |     1
(4 rows)

So?
 
Die Automation ist sehr geschickt, allerding bekomme ich einen SQL Fehler bzgl. des Syntaxes, und das bereits ohne die Automation:

where not EWLG_WRBG_ELEK_MM
AND not EWLG_WRBG_TLFN_MM

Das sind die Original-Feldbezeichnungen anstelle Mail und Telefon.

Er sagt mir:

ORA-00920: Ungültiger relationaler Operator
00920. 00000 - "invalid relational operator"
*Cause:
*Action:
Fehler in Zeile: 11 Spalte: 1

Ist für "WHERE NOT xxxxx AND NOT yyyyy" ein bestimmtes Datenformat für xxxxx/ yyyyy erforderlich? Oder mache ich einen anderen Fehler?
 
Ok, das dachte ich mir. Ich habe gerade in der Dokumentation nachgeschaut. Die Daten sind in der DB als "Charakter" mit Länge 1 gespeichert.
Also muss ich den Syntax umständlicher schreiben:

where KDE.EWLG_WRBG_ELEK_MM = 'N'
AND KDE.EWLG_WRBG_TLFN_MM = 'N'

Dann kann ich sicher auch Deinen Automationstrick vergessen ;//
 
Code:
test=# alter table foo alter COLUMN telefon type varchar;
ALTER TABLE
test=*# alter table foo alter COLUMN mail type varchar;
ALTER TABLE
test=*# select * from foo;
 pers_nr | mail  | telefon
---------+-------+---------
    4711 | false | false
    4612 | true  | true
    4813 | true  | false
    4914 | false | true
(4 rows)

test=*# select mail::text || ' ' || telefon::text as mail_telefon, count(1) from foo group by 1;
 mail_telefon | count
--------------+-------
 false true   |     1
 false false  |     1
 true true    |     1
 true false   |     1
(4 rows)

test=*# select 'mail_nein_telefon_nein' as status, count(*) from foo where mail != 'true' and telefon != 'true' union all select 'mail_ja_telefon_nein', count(*) from foo where mail = 'true' and telefon != 'true';
         status         | count
------------------------+-------
 mail_nein_telefon_nein |     1
 mail_ja_telefon_nein   |     1
(2 rows)

test=*#
 
Du bist definitiv ein DB-Guru. Was bedeutet Alter Table? ich ändere den Datenwert in der Originaltabelle? Ist das ein ändernder/schreibender Zugriff auf die Tabelle?
 
Werbung:
ALTER TABLE? Damit kann ich die Definition einer Tabelle ändern, hier den Typ der zwei Spalten. Man kann aber auch neue Spalten zufügen oder andere löschen oder weitere Eigenschaften ändern.
 
Zurück
Oben