Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[T-SQL] sequence oplopend per group

Pagina: 1
Acties:

  • DukeMan
  • Registratie: Mei 2000
  • Niet online
Ik moet een query genereren waarin een aantal gegevens getoond worden, waarbij er altijd 1 column een "hoofdwaarde" bevat. Bv

NaamLocatiePositie
Loc AAmsterdam1
Loc AEindhoven2
Loc ARotterdam3
Loc BAmsterdam1
Loc BEindhoven2
Loc BRotterdam3
Loc CRotterdam1
Loc CGroningen2


De gegevens in de kolommen Naam en Locatie komen uit een tabel, echter de gegevens uit de kolom Positie bestaan nu niet en moeten in een query aan de resultset worden toegevoegd. De uitvoer van deze query vindt plaats in een Stored Procedure op MSSQL.

Aangezien er maximaal 10-20 posities kunnen voorkomen heb ik een tijdelijke tabel aangemaakt met daarin 20 regels: 1 tot en met 20.

Deze moet ik dus op een of andere manier joinen met de data-tabel op een dusdanige manier dat er als het ware gegroepeerd wordt op Naam en vervolgens bij elke nieuwe naam de nummering weer opnieuw begint.

Ik ben al even aan het stoeien met een statement hiervoor, maar kom er niet helemaal uit. Als ik op woorden als sequence, group, number etc zoek op google krijg ik van alles te zien hoe je een lijst kan bouwen met een oplopende nummering, maar niet hoe ik deze in een bestaande resultset per gegroepeerde items kan invoegen.

Zoals gezegd heb ik lopen stoeien met joins want volgens mij moet ik die gebruiken om die 2 tabellen aan elkaar te knopen, maar kom er met zowel een left, cross of inner join niet uit, aangezien ik niet echt iets heb om te joinen.
Als ik de 2 tabellen met een left join join bv, krijg ik de gegevens uit de tabel gecombineerd met alle 20 regels uit de tijdelijke tabel. Zo krijg ik voor bovenstaand voorbeeld dus 160 records terug. Al met al kom ik er niet uit.

Heeft iemand voor mij tips waarmee ik verder kan?
Mocht dit niet in 1 statement lukken kan ik er altijd met een cursor doorheen gaan en de kolom updaten, maar dit heeft uiteraard niet mijn voorkeur.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waarom zou je dit überhaupt in TSQL willen doen en laat je dit soort dingen niet over aan je applicatie / business logica?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • DukeMan
  • Registratie: Mei 2000
  • Niet online
RobIII schreef op donderdag 14 augustus 2008 @ 14:22:
Waarom zou je dit überhaupt in TSQL willen doen en laat je dit soort dingen niet over aan je applicatie / business logica?
Omdat dit vervolgens weer in een andere tabel moet worden weggeschreven. Dit is een job die 's nachts moet gaan draaien.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Als performance niet zo'n issue is kun je een correlated subquery gebruiken,.

SQL:
1
2
SELECT *, (SELECT COUNT(*) +1 FROM Locaties WHERE Naam =L.Naam AND Locatie < L.Locatie) as Positie
FROM Locaties L


Let er wel op dat je expliciet een volgorde op moet geven.

[ Voor 12% gewijzigd door P_de_B op 14-08-2008 14:32 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • DukeMan
  • Registratie: Mei 2000
  • Niet online
Thanx P_de_B, dat was de truuk!!!
Ik zat dus gewoon te moeilijk te denken.

Nogmaals bedankt