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