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

Benötige Hilfe bei mehrfachen Zeilen, KdNr und Produkt

Dieses Thema im Forum "Microsoft Access" wurde erstellt von nakicam, 6 April 2016.

  1. nakicam

    nakicam Benutzer

    Hallo zusammen,

    ich habe ein Problem und hoffe hier Rat zu finden. Bin leicht am verzweifeln ...

    Wir besitzen ein CRM auf Basis von Access 2003 und ich kann leider kein VBA programmieren um das Problem zu lösen, deshalb dachte ich an eine Möglichkeit mit Hilfe von MySQL, Excell und Co.

    Folgender Fall:

    Durch meine Abfrage entstehen mehrfache Einträge bezüglich Kundennummer um dem Produkt das er erworben hat.

    Tabelle sieht in etwa so aus:

    Kdnr Produkt bestelltAm
    100 A01 01.01.1999
    100 A02 01.01.1999
    100 B03 02.02.1999
    101 WW1 31.12.1998
    ....

    Ich benötige eine Tabelle die:

    - KdNr nur einmal auflistet
    - Erkennt welches das Min Datum jeglicher Käufe eines Kunden ist und "Alle Produkte" die zu diesem Min Datum gefunden werden in ein neues Feld "ErstkaufProdukt" und ErstkaufDatum überführt.
    - Mir würde es schon reichen wenn die Erstkaufprodukte alle als "String" oder der gleichen hinteinander mit Komma getrennt aufgereiht werden und das Min Datum einzeln steht.

    Beispiel:
    Kdnr Produkt bestelltAm
    100 A01, A02, B03 01.01.1999

    Mir geht es am Ende nicht darum diese Daten in das CRM zurück zu führen, sondern um eine Kundenanalyse zu betreiben. Also wenn einer eine bessere Idee hat, dann gerne her damit :).

    Kann mir jemand von euch helfen?

    Laut Internet gibt es sowas wie eine Group_Concat Funktion in SQL welche vielleicht helfen könnte.

    Liebe Grüße
     
    Zuletzt bearbeitet: 6 April 2016
  2. nakicam

    nakicam Benutzer

    Den ersten Teil habe ich gelöst, denke ich:

    SELECT KdNr, Produkt,
    GROUP_CONCAT(Produkt SEPARATOR ', ') AS Produkte
    FROM verkauf
    WHERE KdNr = KdNr
    GROUP BY KdNr;

    Wie kriege ich nun Min Datum ermittelt, und lasse wirklich nur die Daten von MinDatum in "Produkte" einfliessen? ;)
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Deine gezeigte Wunsch-Ergebnismenge ist falsch, oder? Auf alle Fälle aber das gezeigte SQL, das wirft in allen korrekt arbeitenden Datenbanken und auch in aktuellen MySQL-Inkrnationen einen Syntaxfehler.

    Okay:
    Code:
    test=# select * from nakicam ;
     kdnr | produkt |  datum   
    ------+---------+------------
      100 | a01  | 1999-01-01
      100 | a02  | 1999-01-01
      100 | b03  | 1999-02-02
      101 | ww1  | 1998-12-31
    (4 rows)
    
    
    test=# select distinct on (kdnr) kdnr, min(datum), array_to_string(produkte,', ') from (select kdnr, datum, array_agg(produkt) as produkte from nakicam group by 1,2 ) bla group by kdnr, produkte;
     kdnr |  min  | array_to_string
    ------+------------+-----------------
      100 | 1999-01-01 | a01, a02
      101 | 1998-12-31 | ww1
    (2 rows)
    
    



    Das ist aber:

    Code:
    
    test=# select version();
    
      version   
    
    ---------------------------------------------------------------------------------------------------------
    
     PostgreSQL 9.5.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4), 64-bit
    
    (1 row)
    
    
     
  4. nakicam

    nakicam Benutzer

    Hi,

    danke dir für die Lösung. Die muss ich nur noch umgesetzte bekommen.

    Ich arbeite zur Zeit mit HeidiSQL, wenn ich mir das PostgreSQL installieren und connecte, könnte ich dein Beispiel ja nachspielen?

    select distinct on (kdnr) kdnr, min(datum), array_to_string(produkte,', ')
    from (select kdnr, datum, array_agg(produkt) as produkte
    from nakicam group by 1,2 ) bla group by kdnr, produkte;

    Kannst du mir bitte erklären was ich mit "bla" mache? was muss dahin?

    Und könntest du mir kurz erläutern was in der Abfrage ungefähr passiert?

    LG
     
  5. akretschmer

    akretschmer Datenbank-Guru

    das 'bla' ist lediglich ein willkürlich vergebener Tabellenname für die innerhalb der (...) erstellten Tabelle, damit das ... from (...) ALIAS eine benannte Tabelle hat.Innerhalb der Klammern erzeuge ich eine Liste je kdnr und Datum mit den Artikeln, außerhalb der Klammern suche ich dann je kdnr und der Artikelliste nach dem kleinsten Datum. So in grob.
     
  6. nakicam

    nakicam Benutzer

    das Thema mit anderer DB ausprobieren ist klappt bei mir nicht so rund..

    Kann mir einer sagen warum dies hier nicht klappt?
    "
    SELECT KdNr, Produkt,
    GROUP_CONCAT(Produkt SEPARATOR ', ') AS Produkte
    FROM test
    WHERE KdNr = KdNr AND bestelltAm = Min(bestelltAm)
    GROUP BY KdNr;
    "


    Das hier ist der Code für untenstehendes Ergebnis:
    !
    SELECT KdNr, Produkt,
    GROUP_CONCAT(Produkt SEPARATOR ', ') AS Produkte
    FROM test
    WHERE KdNr = KdNr
    GROUP BY KdNr;
    !
    upload_2016-4-7_10-37-19.png

    *Ausgangstabelle
    upload_2016-4-7_10-37-3.png


    Ich wäre soweit zufrieden wenn ich den Weg über MYSQL doch noch hinkriegen würde.. ;)
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Deine Abfrage ist inhaltlich / syntaktisch / logisch falsch. Du kannst nicht aggregieren (Produkt) ohne alle anderen Spalten zu gruppieren (kdnr, produkt) bzw. ist Murks, gleichzeitig produkt und group_concat(produkt) zu machen.
     
  8. nakicam

    nakicam Benutzer

    Danke dir nochmal für die Hilfe. Du hast nicht zufällig ne idee wie die Abfrage oben in MySQL aussehen könnte?
     
  9. akretschmer

    akretschmer Datenbank-Guru

    das hier könnte gehen:

    Code:
    test=# select kdnr, min(datum), array_to_string(array_agg(produkt),', ') from nakicam  where (kdnr, datum) in (select kdnr, min(datum) from nakicam group by kdnr) group by kdnr;
     kdnr |  min  | array_to_string
    ------+------------+-----------------
      101 | 1998-12-31 | ww1
      100 | 1999-01-01 | a01, a02
    (2 Zeilen)
    
    das array_agg - zeugs mußt noch anpassen, das überlasse ich dir zur übung ...
     
  10. nakicam

    nakicam Benutzer

    select KdNr, min(bestelltAm),
    GROUP_CONCAT(GROUP_CONCAT(produkt),', ')
    from tid where (KdNr, bestelltAm) in (select KdNr, min(bestelltAm) from tid group by KdNr) group by KdNr;

    bekomme Meldung dass die GROUP Funktion invalide ist?

    upload_2016-4-11_12-25-18.png
     
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