Folosind datele de test ale lui katalyn, am făcut o altă variantă fără cursor, dar cu o funcţie:
CREATE FUNCTION dbo.TreiClientiMariDinOrasul(@Oras nvarchar(40))
RETURNS nvarchar(126) AS BEGIN
DECLARE @lista nvarchar(126)
SELECT TOP 3 @lista=ISNULL(@lista+'; ','')+Client
FROM T WHERE Oras=@Oras
ORDER BY Total DESC
RETURN @lista
END
GO
SELECT Oras, dbo.TreiClientiMariDinOrasul(Oras)
FROM (SELECT DISTINCT Oras FROM T) X
În SQL 2005 s-ar putea cu un "simplu" SELECT, astfel:
SELECT Oras, MIN(CASE WHEN rn=1 THEN Client END)
+ISNULL(';'+MIN(CASE WHEN rn=2 THEN Client END),'')
+ISNULL(';'+MIN(CASE WHEN rn=3 THEN Client END),'') AS Clienti
FROM (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY Oras ORDER BY Total DESC
) rn FROM T
) X GROUP BY Oras
E interesant de observat că putem obţine rezultate diferite (cel puţin la aceste date de test), deoarece nu s-a precizat ce facem dacă sunt mai mulţi clienţi cu exact acelaşi total.
Răzvan