Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

rank() in Oracle will nicht so wie ich will

16 views
Skip to first unread message

Michael Jakobs

unread,
Dec 11, 2012, 8:40:27 AM12/11/12
to
Hi,

ich habe eine Tabelle ᅵhnlich der unten aufgefᅵhrten. Hier hᅵtte ich
gerne den Rang pro Kunde ᅵber den gesamten Zeitraum, also ᅵber alle
Jahre. Ich meine ich hᅵtte so etwas schon mal mit rank() gemacht. Ich
kriegs aber nicht wieder hin :-(. Oder denk ich grad vᅵllig falsch und
ich muss zwingend erst einen select mit group by ᅵber den KUNDE machen?
Und das Ergebnis dann wieder mit meinem eigentlichen Select joinen?


KUNDE JAHR UMSATZ
Kunze 2010 200,00
Kunze 2011 150,00
Kunze 2012 40,00
Meier 2010 100,00
Meier 2011 150,00
Meier 2012 80,00
Mᅵller 2010 50,00
Mᅵller 2011 70,00
Mᅵller 2012 100,00

Create und Inserts fᅵr die Beispieltabelle habe ich unten angehᅵngt. Ich
habe hier grad ein Ora 10.2.0.4.


Grᅵᅵe
Michael


create table TEST_RANK
(
KUNDE VARCHAR2(255),
JAHR INTEGER,
UMSATZ NUMBER(15,2)
)
;

insert into TEST_RANK (KUNDE, JAHR, UMSATZ)
values ('Meier', 2010, 100);
insert into TEST_RANK (KUNDE, JAHR, UMSATZ)
values ('Meier', 2011, 150);
insert into TEST_RANK (KUNDE, JAHR, UMSATZ)
values ('Meier', 2012, 80);
insert into TEST_RANK (KUNDE, JAHR, UMSATZ)
values ('Mᅵller', 2010, 50);
insert into TEST_RANK (KUNDE, JAHR, UMSATZ)
values ('Mᅵller', 2011, 70);
insert into TEST_RANK (KUNDE, JAHR, UMSATZ)
values ('Mᅵller', 2012, 100);
insert into TEST_RANK (KUNDE, JAHR, UMSATZ)
values ('Kunze', 2010, 200);
insert into TEST_RANK (KUNDE, JAHR, UMSATZ)
values ('Kunze', 2011, 150);
insert into TEST_RANK (KUNDE, JAHR, UMSATZ)
values ('Kunze', 2012, 40);
commit;

Jörg Burzeja

unread,
Dec 11, 2012, 2:07:06 PM12/11/12
to
Am 11.12.2012 14:40, schrieb Michael Jakobs:

> ich habe eine Tabelle ähnlich der unten aufgeführten. Hier hätte ich
> gerne den Rang pro Kunde über den gesamten Zeitraum, also über alle
> Jahre. Ich meine ich hätte so etwas schon mal mit rank() gemacht. Ich
> kriegs aber nicht wieder hin :-(. Oder denk ich grad völlig falsch und
> ich muss zwingend erst einen select mit group by über den KUNDE machen?
> Und das Ergebnis dann wieder mit meinem eigentlichen Select joinen?


Das ist für MSSQL; Oracle kann es bestimmt auch, wobei die Synatx
durchaus etwas anders sein kann. Da kenne ich mich aber nicht aus.

Schönen Abend.


CREATE TABLE #xyz ( Name VARCHAR(30) NOT NULL)

INSERT #xyz SELECT 'Müller, Karl'
INSERT #xyz SELECT 'Schmidt, Bernhard'
INSERT #xyz SELECT 'Becker, Fritz'


SELECT rank() OVER (ORDER BY name) AS [lfd. Nr],
name AS [mit rank]
FROM #xyz
ORDER BY name



--
Viele Grüsse
Jörg

Jörg Burzeja

unread,
Dec 11, 2012, 2:16:34 PM12/11/12
to
Am 11.12.2012 20:07, schrieb Jᅵrg Burzeja:
> Am 11.12.2012 14:40, schrieb Michael Jakobs:
>
>> ich habe eine Tabelle ᅵhnlich der unten aufgefᅵhrten. Hier hᅵtte ich
>> gerne den Rang pro Kunde ᅵber den gesamten Zeitraum, also ᅵber alle
>> Jahre. Ich meine ich hᅵtte so etwas schon mal mit rank() gemacht. Ich
>> kriegs aber nicht wieder hin :-(. Oder denk ich grad vᅵllig falsch und
>> ich muss zwingend erst einen select mit group by ᅵber den KUNDE machen?
>> Und das Ergebnis dann wieder mit meinem eigentlichen Select joinen?
>
>
> Das ist fᅵr MSSQL; Oracle kann es bestimmt auch, wobei die Synatx
> durchaus etwas anders sein kann. Da kenne ich mich aber nicht aus.
>
> Schᅵnen Abend.
>
>
> CREATE TABLE #xyz ( Name VARCHAR(30) NOT NULL)
>
> INSERT #xyz SELECT 'Mᅵller, Karl'
> INSERT #xyz SELECT 'Schmidt, Bernhard'
> INSERT #xyz SELECT 'Becker, Fritz'
>
>
> SELECT rank() OVER (ORDER BY name) AS [lfd. Nr],
> name AS [mit rank]
> FROM #xyz
> ORDER BY name

Nachtrag:

Ergebnis:
========

lfd. Nr mit rank
1 Becker, Fritz
2 Mᅵller, Karl
3 Schmidt, Bernhard



Ohne 'rank() OVER' geht das natᅵrlich auch, ist nur etwas lᅵnger:


USE tempdb
GO

CREATE TABLE #temp (
Name varchar(10),
Mitarb smallint,
Datum datetime
)
GO

INSERT INTO #temp
SELECT 'Meier', 4, '20070105' UNION ALL
SELECT 'Meier', 4, '20080124' UNION ALL
SELECT 'Schrader', 25, '20051011' UNION ALL
SELECT 'Schrader', 25, '20080128' UNION ALL
SELECT 'Schrader', 25, '20020111'


GO

SELECT t1.*,
(SELECT Count(*)
FROM #temp t2
WHERE t2.Name = t1.Name
AND t2.Mitarb = t1.Mitarb
AND t2.Datum <= t1.Datum
) AS Position

FROM #temp t1

ORDER BY Name, Datum
GO

DROP TABLE #temp
GO


Ergebnis:
========
Name Mitarb Datum Position
Meier 4 2007-01-05 00:00:00.000 1
Meier 4 2008-01-24 00:00:00.000 2
Schrader 25 2002-01-11 00:00:00.000 1
Schrader 25 2005-10-11 00:00:00.000 2
Schrader 25 2008-01-28 00:00:00.000 3

--
Viele Grᅵsse
Jᅵrg

Tim Landscheidt

unread,
Dec 11, 2012, 7:56:00 PM12/11/12
to
Michael Jakobs <mj20...@nurfuerspam.de> wrote:

> ich habe eine Tabelle ähnlich der unten aufgeführten. Hier
> hätte ich gerne den Rang pro Kunde über den gesamten
> Zeitraum, also über alle Jahre. Ich meine ich hätte so etwas
> schon mal mit rank() gemacht. Ich kriegs aber nicht wieder
> hin :-(. Oder denk ich grad völlig falsch und ich muss
> zwingend erst einen select mit group by über den KUNDE
> machen? Und das Ergebnis dann wieder mit meinem eigentlichen
> Select joinen?


> KUNDE JAHR UMSATZ
> Kunze 2010 200,00
> Kunze 2011 150,00
> Kunze 2012 40,00
> Meier 2010 100,00
> Meier 2011 150,00
> Meier 2012 80,00
> Müller 2010 50,00
> Müller 2011 70,00
> Müller 2012 100,00

> Create und Inserts für die Beispieltabelle habe ich unten
> angehängt. Ich habe hier grad ein Ora 10.2.0.4.
> [...]

Ohne Oracle zu kennen: Ich sehe keine Möglichkeit, das ohne
Sub-Select zu erreichen, sprich:

| SELECT Kunde, RANK() OVER (ORDER BY Umsatzsumme)
| FROM
| (SELECT Kunde, SUM(Umsatz) AS Umsatzsumme
| FROM Test_Rank
| GROUP BY Kunde) AS SubSelect;

Tim

Kay Kanekowski

unread,
Dec 12, 2012, 1:33:57 AM12/12/12
to
Hallo Michael,
sorry, aber so ganz habe ich Deine Anforderunge wohl nicht verstanden. Wie soll denn Dein Ergebnis aussehen ?
Anzubieten hätte ich sowas:


SELECT KUNDE,
sum(umsatz) as umsatz_pro_kunde,
rank() OVER (ORDER BY sum(umsatz) desc) as umsatz_rang
FROM TEST_RANK
group by kunde
;

KUNDE UMSATZ_PRO_KUNDE UMSATZ_RANG
--------------- ---------------- -----------
Kunze 390 1
Meier 330 2
Müller 220 3

3 Zeilen ausgewählt.

bis denn
Kay

Kay Kanekowski

unread,
Dec 12, 2012, 1:36:16 AM12/12/12
to
uups, vergessen: Oracle 11.2.0.2

Bernd Nawothnig

unread,
Dec 12, 2012, 4:58:02 PM12/12/12
to
On 2012-12-11, Michael Jakobs wrote:
> ich habe eine Tabelle ähnlich der unten aufgeführten. Hier hätte ich
> gerne den Rang pro Kunde über den gesamten Zeitraum, also über alle
> Jahre. Ich meine ich hätte so etwas schon mal mit rank() gemacht. Ich
> kriegs aber nicht wieder hin :-(. Oder denk ich grad völlig falsch und
> ich muss zwingend erst einen select mit group by über den KUNDE machen?
> Und das Ergebnis dann wieder mit meinem eigentlichen Select joinen?

http://www.techonthenet.com/oracle/functions/rank.php




Bernd

--
no time toulouse
0 new messages