Benötige Hilfe bei mehrfachen Zeilen, KdNr und Produkt

nakicam

Benutzer
Beiträge
13
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:
Werbung:
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? ;)
 
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)
 
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
 
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.
 
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.. ;)
 
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.
 
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 ...
 
Werbung:
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
 
Zurück
Oben