SQL Abfrage mit (laufenden) Zahlen

Squicky

Lt. Commander
Registriert
Sep. 2002
Beiträge
1.433
Hallo

Ich suche eine SQL Abfrage mit automatisch laufenden Zahlen.
Am besten ich geben ein Spiele für eine Tabelle, und was die Abfrage liefern soll:

Tabelle:
PersonID | GerätID
p2 | g2
p2 | g7
p3 | g9
p4 | g8
p4 | g1
p3 | g5
p7 | g3
p3 | g6


Abfrage Tabelle
PersonID | GerätID | Anzahl_Von
p2 | g2 | 1 von 2
p2 | g7 | 2 von 2
p3 | g9 | 1 von 3
p4 | g8 | 1 von 2
p4 | g1 | 2 von 2
p3 | g5 | 2 von 3
p7 | g3 | 1 von 1
p3 | g6 | 3 von 3


Die neue Spalte " Anzahl von " soll immer angeben, um das wievielte Gerät es sich handelt, das eine Person zugeordnet ist; und wieviele Gerät eine Person zugeordnet sind.

Die Summe, wieviele Geräte einer Person zugeordnet sind, mach tmir keine Probleme. Aber die fortlaufende Nummer: keine Ahnung wie das geht.


Wer kann da helfen?


Danke
 
ich würd sowas nicht umbedingt krampfhaft versuchen direkt aus SQL so auszuquetschen, ich würd mit der Programmiersprache mit der du dir die Sachen aus der Datenbank ziehst die Dinger einfach zählen und ausgeben :P
 
Leider ist ein timestamp oder so nicht möglich.
Die Anfrage muss wie oben beschrieben per SQL erstellt werden.
Eine Programmiersprache kann da nicht helfen.
 
Squicky schrieb:
Die Summe, wieviele Geräte einer Person zugeordnet sind, mach tmir keine Probleme. Aber die fortlaufende Nummer: keine Ahnung wie das geht.

Post mal bitte deine Abfrage mit der du die Anzahl der Geräte pro Person ermittelst.
Vielleicht kann ich dann was machen.

Greetings
 
Die Abfrage:

SELECT a.[person_id]
,a.[geraet_id]
,(SELECT Count(*) From squicky b where a.[person_id] = b.[person_id]) AS Anzahl_Von
FROM squicky a

liefert folgende Tabelle:

person_id | geraet_id | Anzahl_Von
p2 | g2 | 2
p2 | g7 | 2
p3 | g9 | 3
p4 | g8 | 2
p4 | g1 | 2
p3 | g5 | 3
p7 | g3 | 1
p3 | g6 | 3


Wie bekommt man nun die laufende Nummer hinein?
 
Ungetestet würde ich jetzt mal sowas in den Raum werfen:
Code:
SELECT a.[person_id],a.[geraet_id]
,(SELECT Count(*) as row From squicky b where a.[person_id] = b.[person_id]) AS Anzahl_Von
,(SELECT Row FROM 
     (SELECT ROW_NUMBER() OVER (ORDER BY a.[person_id]) as Row From squicky c where a.[geraet_id]] = c.[geraet_id]) as d
  WHERE d.[person_id] = a.[person_id]) AS Anzahl_2
FROM squicky a
Performant ist das allerdings definitiv nicht. Bei größeren Datenmengen solltest du da dringend etwas mit einer Programmiersprache machen.
MySQL bietet was ganz Schönes an: http://www.xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql/ Das wäre wohl deutlich performanter (müsstest aber nach geraet_id sortieren damit das so funktioniert).
 
Von welcher Datenbank reden wir hier eigentlich?
Für Oracle ließe sich das ganze mit analytischen Funktionen ziemlich elegant lösen. Wie das bei anderen Systemen aussieht, weiß ich leider nicht.
 
hallo das system ist Microsoft SQl 2005.

Habe auch schon eine Lösung, aber wie gut diese müsst ihr mir sagen.

SELECT a.[person_id]
,a.[geraet_id]
,(
SELECT
Count(*)
From
squicky b
where
a.[person_id] = b.[person_id]
) AS Anzahl_Von
,row_number()
over(partition by a.person_id order by a.person_id) AS Test
FROM squicky a


Danke
 
Da du offenbar analytische Funktionen benutzen kannst würde ich das etwa so formulieren:

SELECT a.[person_id]
,a.[geraet_id]
,COUNT(*) OVER (PARTITION BY a.person_id) AS Anzahl_Von
,row_number() over (partition by a.person_id order by a.geraet_id) AS Test
FROM squicky a

Damit sparst du dir die Subselects, die er sosnt für jede Row ausführen muss.
 
Zurück
Oben