Mir ist irgendwie kein vernünftiger Titel hierfür eingefallen ;-)
Problem: Es gibt eine Tabelle mit Kundendaten: kundennummer int, artikelnummer char(3), bezeichnung varchar(100)
Der gleiche Artikel kann bei mehreren Kunden vorkommen, etwa: Kunde 1, Artikel 001, Bezeichnung "Artikel A" Kunde 2, Artikel 001, Bezeichnung "Artikel A" Kunde 3, Artikel 001, Bezeichnung "Artikel A" Kunde 1, Artikel 002, Bezeichnung "ZZZZZZ" Kunde 2, Artikel 002, Bezeichnung "Artikel B" Kunde 3, Artikel 002, Bezeichnung "Artikel B" Kunde 1, Artikel 003, Bezeichnung "Artikel C" Kunde 2, Artikel 003, Bezeichnung "AAAAAAA" Kunde 3, Artikel 003, Bezeichnung "Artikel C"
Ich will jetzt wissen: Welche Artikelnummern haben welche Bezeichnung, unabhängig vom Kunden. Es soll hierbei die am häufigsten vorkommende Bezeichnung zurückgeliefert werden, also nach obigem Beispiel: Artikel 001, Bezeichnung "Artikel A" Artikel 002, Bezeichnung "Artikel B" Artikel 003, Bezeichnung "Artikel C"
Ein MIN() und MAX() helfen hier nix... Sonst würde ja "AAAAA" oder "ZZZZZ" zurückgeliefert werden, und nicht der am häufigsten vorkommende Name...
Jemand eine Idee, wie man das als SELECT formulieren kann?
SELECT n.[ProductNumber],d.[Description] FROM (SELECT DISTINCT d.[ProductNumber] FROM @descriptions d) n OUTER APPLY (SELECT TOP 1 d.[Description] FROM @descriptions d WHERE d.[ProductNumber] = n.[ProductNumber] GROUP BY d.[Description] ORDER BY COUNT(1) DESC) d
WITH cte AS ( select productnumber ,description ,ROW_NUMBER() OVER (Partition BY ProductNumber ORDER BY Anzahl desc) AS Row FROM ( select productnumber, description, COUNT(description) anzahl from @descriptions group by productnumber,description ) a )
Klasse, auch Dir vielen Dank dafür... Auf ROW_NUMBER() hätt ich auch kommen können... Schade, dass man nur eine Antwort mit nem Haken markieren kann ;-)
SELECT COUNT(artikelnummer + bezeichnung) AS Expr1, artikelnummer, bezeichnung FROM Kundendaten GROUP BY artikelnummer + bezeichnung, artikelnummer, bezeichnung order by Expr1 desc, bezeichnung
liefert folgendes Ergebnis:
Expr1 artikelnummer bezeichnung 3 001 Artikel A 2 002 Artikel B 2 003 Artikel C 1 003 AAAAAA 1 002 ZZZZZZ
Hier wird nach der Summe der zusammengesetzen Spalten sortiert und bei gleicher Summe nach Bezeichnung.
War das so gemeint?
Wenn es nur um die Bezeichnung geht, einfach die artikelnummer weg lassen.
Soweit war mir das auch schon klar, aber wie bekomme ich damit eine Tabelle, wo nur noch EIN Datensatz pro Artikelnummer enthalten ist, und dazu die häufigste vorkommende Bezeichnung? Im Ergebnis also maximal 3 Sätze nach dem obigen Beispiel...
Nö, das ist leider kein valides SQL, der SQL-Server bringt als Fehlermeldung:
Meldung 8120, Ebene 16, Status 1, Zeile 1 Die kundentabelle.bezeichnung-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.
Schade, dass man nur eine Antwort mit nem Haken markieren kann ;-)