Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Eine neue Spalte meiner Abfrage hinzufügen

Dieses Thema im Forum "Oracle" wurde erstellt von Cr4m0, 21 November 2013.

  1. Cr4m0

    Cr4m0 Benutzer

    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.
     
  2. ukulele

    ukulele Datenbank-Guru

    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'
     
  3. Cr4m0

    Cr4m0 Benutzer

    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
     
  4. ukulele

    ukulele Datenbank-Guru

    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;
     
  5. Cr4m0

    Cr4m0 Benutzer

    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.
     
  6. ukulele

    ukulele Datenbank-Guru

    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;
     
  7. Cr4m0

    Cr4m0 Benutzer

    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?
     
  8. ukulele

    ukulele Datenbank-Guru

    In welcher Spalte?
     
  9. Cr4m0

    Cr4m0 Benutzer

    In der Flag Spalte.
     
  10. ukulele

    ukulele Datenbank-Guru

    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.
     
  11. Cr4m0

    Cr4m0 Benutzer

    Genau das habe ich gesucht, danke dir!
     
  12. Cr4m0

    Cr4m0 Benutzer

    Kann ich das ganze eigentlich auch nach Monaten Anzeigen? Also wieviel User haben im Januar, Februar usw. Flag A,B oder C
     
  13. ukulele

    ukulele Datenbank-Guru

    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;
     
  14. Cr4m0

    Cr4m0 Benutzer

    left(c.reg_dayid,6) wofür steht die "6" ?
     
  15. Cr4m0

    Cr4m0 Benutzer

    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
    .
    .
    .
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden