Eine neue Spalte meiner Abfrage hinzufügen

Cr4m0

Benutzer
Beiträge
22
Hi,
folgendes Problem:
ich habe drei Tabellen die ich über die Kundennummer Joine. Soweit so gut. So sieht meine Abfrage aus:
SELECT DISTINCT cml.uniquecustomerid,
FROM dwh.cust_mailing_list cml,
dwh.sales s,
dwh.cust_prod_notify cpn
WHERE cml.customerid = s.customerid
AND cml.customerid = cpn.customerid
AND s.productid = '1'
AND s.siteid = '2';
nun würde ich gern meiner abfrage eine neue spalte hinzufügen die abhängig von werten aus der Tabelle dwh.cust_prod_notify ist. In der cust_prod_notify gibt es eine spalte die Werte von 0 bis 3 enhält. Nun möchte ich das in der neuen spalte für jeden Kunden eine neue Bezeichnung für diese Werte zwischen 0-3. Wenn 0 dann A, wenn 1 dann B, wenn 2 dann C und wenn 3 dann D.
Wie baue ich das in meine Abfrage?
Vielen Dank.
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.702
z.B. so:
Code:
SELECT    DISTINCT
        cml.uniquecustomerid,
        (    CASE
            WHEN    cpn.spalte = 0    THEN    'A'
            WHEN    cpn.spalte = 1    THEN    'B'
            WHEN    cpn.spalte = 2    THEN    'C'
            WHEN    cpn.spalte = 3    THEN    'D'
            ELSE    NULL
            END ) AS Bezeichnung
FROM    dwh.cust_mailing_list cml,
        dwh.sales s,
        dwh.cust_prod_notify cpn
WHERE    cml.customerid = s.customerid
AND        cml.customerid = cpn.customerid
AND        s.productid = '1'
AND        s.siteid = '2'
 

Cr4m0

Benutzer
Beiträge
22
Hi,

dank deiner Hilfe habe ich nun folgendes Statement gebastelt:

SELECTDISTINCT c.customerid,
c.reg_dayid AS Reg_day,
( CASE
WHEN cpn.jackpot_alert > 0 and cml.standard_newsletter > 0 THEN 'C'
WHEN cpn.jackpot_alert = 0 and cml.standard_newsletter > 0 THEN 'B'
WHEN cml.standard_newsletter = 0 and cpn.jackpot_alert > 0 THEN 'A'
ELSE''END ) AS Flag
FROM dwh.cust_mailing_list cml,
dwh.sales s,
dwh.cust_prod_notify cpn,
dwh.customer c
WHERE cml.customerid = s.customerid
AND cml.customerid = cpn.customerid
AND cml.customerid = c.customerid
AND cpn.productid = '1'
AND s.productid = '1'
AND s.siteid = '2'
AND s.paid = '1'
AND s.cancelled = '0'
AND s.purchasedayid >= '20121201'
AND c.reg_dayid >= '20121201'
ORDERBY 1;

Das Ergebnis ist eine Tabelle mit allen CustomerId's die jeweils in Gruppen A, B oder C aufgeteilt wurden. Wie kann ich diese denn nun zählen? Ich möchte also wissen wieviele Customer in Gruppe A, b sowie C sind.

Vielen Dank
 

ukulele

Datenbank-Guru
Beiträge
4.702
Auf jedenfall ohne DISTINCT und mit GROUP BY. Wegen der CASE Schleife bin ich mir nicht sicher ob es direkt in dem Select läuft aber mit einem weiteren Select gehts auf jedenfall.
Code:
SELECT    t.customerid,
        t.Reg_day,
        t.Flag,
        count(t.customerid) AS Anzahl
FROM    (
SELECT c.customerid,
c.reg_dayid AS Reg_day,
( CASE
WHEN cpn.jackpot_alert > 0 and cml.standard_newsletter > 0 THEN 'C'
WHEN cpn.jackpot_alert = 0 and cml.standard_newsletter > 0 THEN 'B'
WHEN cml.standard_newsletter = 0 and cpn.jackpot_alert > 0 THEN 'A'
ELSE''END ) AS Flag
FROM dwh.cust_mailing_list cml,
dwh.sales s,
dwh.cust_prod_notify cpn,
dwh.customer c
WHERE cml.customerid = s.customerid
AND cml.customerid = cpn.customerid
AND cml.customerid = c.customerid
AND cpn.productid = '1'
AND s.productid = '1'
AND s.siteid = '2'
AND s.paid = '1'
AND s.cancelled = '0'
AND s.purchasedayid >= '20121201'
AND c.reg_dayid >= '20121201'
) t
GROUP BY t.customerid,t.Reg_day,t.Flag
ORDER BY 1;
 

Cr4m0

Benutzer
Beiträge
22
Hi Ukulele,

dein Statement zählt irgendetwas, aber nicht das was ich suche ;)

Ich möchte quasi alle Gruppen Zählen. Als Beispiel hier das Ergebnis meiner Abfrage:

Customerid - Reg_Day - Flag
12345 - 20120101 - A
12346 - 20120101 - B
12347 - 20120101 - A

nun möchte ich eine Zusammenfassung von den Flags. Also A = 2 und B = 1

Vielen Dank.
 

ukulele

Datenbank-Guru
Beiträge
4.702
Achso sry. Da kannst du das GROUP BY aber auch sehr gut nutzen. Lediglich die Spalten customerid und Reg_day müssen entweder ausgeblendet werden, in die Gruppierung mit aufgenommen werden oder aggregiert werden.
Code:
SELECT    --t.Reg_day,
        t.Flag,
        count(t.customerid) AS Anzahl
FROM    (
SELECT DISTINCT c.customerid,
c.reg_dayid AS Reg_day,
( CASE
WHEN cpn.jackpot_alert > 0 and cml.standard_newsletter > 0 THEN 'C'
WHEN cpn.jackpot_alert = 0 and cml.standard_newsletter > 0 THEN 'B'
WHEN cml.standard_newsletter = 0 and cpn.jackpot_alert > 0 THEN 'A'
ELSE''END ) AS Flag
FROM dwh.cust_mailing_list cml,
dwh.sales s,
dwh.cust_prod_notify cpn,
dwh.customer c
WHERE cml.customerid = s.customerid
AND cml.customerid = cpn.customerid
AND cml.customerid = c.customerid
AND cpn.productid = '1'
AND s.productid = '1'
AND s.siteid = '2'
AND s.paid = '1'
AND s.cancelled = '0'
AND s.purchasedayid >= '20121201'
AND c.reg_dayid >= '20121201'
) t
GROUP BY t.Flag--hier eventuell noch t.Reg_day anhängen
ORDER BY 1;
 

Cr4m0

Benutzer
Beiträge
22
Hi,

danke das ist die richtige abfrage. nur ein Problem habe ich noch. es gibt auch zellen die keinen Inhalt haben. wie schließe ich diese aus?
 

ukulele

Datenbank-Guru
Beiträge
4.702
Nun deine CASE Schleife deckt dann nicht alle vorkommenden Fälle ab und mit ELSE '' wird eine Zelle mit 0 Zeichen zurück geben. Willst du diese nur nicht anzeigen dann würde ich die äußere Abfrage anpassen:
Code:
SELECT    --t.Reg_day,
        t.Flag,
        count(t.customerid) AS Anzahl
FROM    (
SELECT DISTINCT c.customerid,
c.reg_dayid AS Reg_day,
( CASE
WHEN cpn.jackpot_alert > 0 and cml.standard_newsletter > 0 THEN 'C'
WHEN cpn.jackpot_alert = 0 and cml.standard_newsletter > 0 THEN 'B'
WHEN cml.standard_newsletter = 0 and cpn.jackpot_alert > 0 THEN 'A'
ELSE''END ) AS Flag
FROM dwh.cust_mailing_list cml,
dwh.sales s,
dwh.cust_prod_notify cpn,
dwh.customer c
WHERE cml.customerid = s.customerid
AND cml.customerid = cpn.customerid
AND cml.customerid = c.customerid
AND cpn.productid = '1'
AND s.productid = '1'
AND s.siteid = '2'
AND s.paid = '1'
AND s.cancelled = '0'
AND s.purchasedayid >= '20121201'
AND c.reg_dayid >= '20121201'
) t
WHERE t.Flag != ''
GROUP BY t.Flag--hier eventuell noch t.Reg_day anhängen
ORDER BY 1;
Aber vorsicht, die werden natürlich auch nicht mitgezählt.
 

ukulele

Datenbank-Guru
Beiträge
4.702
Sicherlich. Allerdings scheinst du keine Datumsspalte zu haben sondern 2 ähnliche Spalten c.reg_dayid und s.purchasedayid. Die, die du dafür als Grundlage haben willst, solltest du aus dem inneren in den äußeren Select übergeben und dann im GROUP BY nutzen. Hier mal ein Ansatz:
Code:
SELECT    t.Reg_day,
        t.Flag,
        count(t.customerid) AS Anzahl
FROM    (
SELECT    DISTINCT
        c.customerid,
        left(c.reg_dayid,6) AS Reg_day,
( CASE
WHEN cpn.jackpot_alert > 0 and cml.standard_newsletter > 0 THEN 'C'
WHEN cpn.jackpot_alert = 0 and cml.standard_newsletter > 0 THEN 'B'
WHEN cml.standard_newsletter = 0 and cpn.jackpot_alert > 0 THEN 'A'
ELSE '' END ) AS Flag
FROM dwh.cust_mailing_list cml,
dwh.sales s,
dwh.cust_prod_notify cpn,
dwh.customer c
WHERE cml.customerid = s.customerid
AND cml.customerid = cpn.customerid
AND cml.customerid = c.customerid
AND cpn.productid = '1'
AND s.productid = '1'
AND s.siteid = '2'
AND s.paid = '1'
AND s.cancelled = '0'
AND s.purchasedayid >= '20121201'
AND c.reg_dayid >= '20121201'
) t
WHERE t.Flag != ''
GROUP BY t.Flag, t.Reg_day
ORDER BY 1;
 
Werbung:

Cr4m0

Benutzer
Beiträge
22
Ah ich glaub ich habe mich missverständlich ausgedrückt :)

mit left würde ich ja einfach nur die tage der reg_dayid abschneiden damit ich dann den ganzen kram als Monat angezeigt bekomme.
ich würde das Ergebnis aber gern bündeln. also das ich folgendes Ergebnis bekomme:

Reg_Day A B C
201301 200 205 312
201302 196 288 306
201303 351 13 875
.
.
.
 
Oben