Announcement

Collapse
No announcement yet.

Top 10 Artikel eines jeden Kunden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Top 10 Artikel eines jeden Kunden

    Hallo, das Problem kommt mir fast zu banal vor, um danach zu fragen. Aber bisher konnte mir niemand weiterhelfen.

    Problem:
    Folgende Tabelle:
    kunde artikel umsatz
    01 500 1000
    01 100 30
    01 500 20
    01 611 1500
    02 500 20
    02 611 300
    02 611 500
    03 700 2
    03 500 5
    03 600 7

    Jeder verkauf wird darin festgehalten.
    Jetzt möchte ich ie Top 2 Artikel eines jeden Kunden mit Summe(Umsatz)

    Erster Lösungsansatz:
    select kunde, artikel, sum(umsatz) Summe
    from top10 <- nicht verwirren lassen, so heißt die Tablle ;-)
    group by kunde, artikel
    order by kunde, summe DESC

    So bekomm ich aber alle artikel eines Kunden zurück und nicht nur die besten zwei. Hier mal ne Tabelle nach der Abfrage:
    Kunde Artikel Summe
    01 611 1500
    01 500 1020
    01 100 30
    02 611 800
    02 500 20
    03 600 7
    03 500 5
    03 700 2
    Danke schon mal für jeden Hinweis ;-)

  • #2
    Hallo,

    Du warst doch schon auf dem richtigen Weg, ich würde für die Lösung eine temp. Tabelle erstellen:
    HTML Code:
    Create Table #Top10 (kunde char(2), artikel int, umsatz money)
    Create Table #Temp (ID int identity primary key, kunde char(2), artikel int, umsatz money)
    --
    insert into #Top10 values('01', 500, 1000)
    insert into #Top10 values('01', 100, 30)
    insert into #Top10 values('01', 500, 20)
    insert into #Top10 values('01', 611, 1500)
    insert into #Top10 values('02', 500, 20)
    insert into #Top10 values('02', 611, 300)
    insert into #Top10 values('02', 611, 500)
    insert into #Top10 values('03', 700, 2)
    insert into #Top10 values('03', 500, 5)
    insert into #Top10 values('03', 600, 7)
    --
    insert into #Temp(kunde, artikel, umsatz)
    select kunde, artikel, sum(umsatz) Summe
    from #Top10
    group by kunde, artikel
    order by kunde, summe DESC
    --
    select *
    from #Temp a
    	inner join 
    	(
    		select kunde, min(ID) as ID
    		from #Temp
    		group by kunde
    	) b on b.ID = a.ID or b.ID + 1 = a.ID
    order by kunde, umsatz desc
    --
    drop table #Temp
    drop table #Top10
    Wenn Du SQL-Server 2005 benutzt, dann geht es auch direkt:
    HTML Code:
    ;with cte as
    (
    select 
    	row_number() over (partition by kunde order by kunde, sum(umsatz) desc) as sort
    	, kunde
    	, artikel
    	, sum(umsatz) Summe
    from #Top10
    group by kunde, artikel
    )
    select *
    from cte
    where sort <= 2
    order by kunde, summe DESC
    Viele Grüße
    Olaf

    Comment


    • #3
      Hey, cool! Es klappt. Besten Dank. Auf den Trick mit den Ids (niedrigste Id -> höchsten Umsatz und dann der Join) wär ich aber nie gekommen ;-)

      Hast du das Problem schon gekannt, oder hast du rumprobiert?

      Comment

      Working...
      X