| 

.NET C# Java Javascript Exception

1
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?
02.03.2011
commänder 281 6
5 Antworten
2
DECLARE @descriptions TABLE (
[CustomerNumber] INT NOT NULL,
[ProductNumber] CHAR(3) NOT NULL,
[Description] VARCHAR(100) NOT NULL )

INSERT @descriptions
VALUES (1,'001','Artikel A'),
(2,'001','Artikel A'),
(3,'001','Artikel A'),
(1,'002','ZZZZZZ'),
(2,'002','Artikel B'),
(3,'002','Artikel B'),
(1,'003','Artikel C'),
(2,'003','AAAAAAA'),
(3,'003','Artikel C')

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
03.03.2011
Daniel Kuppitz 596 6
2
Hier noch ein Beispiel - lt. Ausführungsplan 8 % "besser" ;-) Schöne Spielerei am Abend.

DECLARE @descriptions TABLE (
[CustomerNumber] INT NOT NULL,
[ProductNumber] CHAR(3) NOT NULL,
[Description] VARCHAR(100) NOT NULL )

INSERT @descriptions
VALUES (1,'001','Artikel A'),
(2,'001','Artikel A'),
(3,'001','Artikel A'),
(1,'002','ZZZZZZ'),
(2,'002','Artikel B'),
(3,'002','Artikel B'),
(1,'003','Artikel C'),
(2,'003','AAAAAAA'),
(3,'003','Artikel C');

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
)

select * from cte where row = 1


@Daniel Danke für die Beispieldaten
03.03.2011
Axel 170 5
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 ;-)
commänder 03.03.2011
0
Folgende Abfrage:
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.
02.03.2011
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...
commänder 03.03.2011
0
Übersehe ich etwas, wenn ich mit diesem kurzen Statement komme?
select artikelnummer, bezeichnung from tabelle group by artikelnummer, bezeichnung order by count(*) desc
03.03.2011
tb 220 3
Ja, denn dann kommen am Ende auch die unerwünschten Bezeichnungen.
Daniel Kuppitz 03.03.2011
OK, die Bezeichnungen können je Artikel anders ausfallen - hab ich leider nicht gesehen.
tb 03.03.2011
-1
Ohne es getestet zu haben, müsste es in etwa so gehen:
SELECT artikelnummer,bezeichnung FROM kundentabelle
GROUP BY artikelnummer
ORDER BY COUNT(*)
02.03.2011
JeffRogge 293 4
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.
commänder 03.03.2011

Stelle deine Sql-Frage jetzt!