Welcome to Sign in | Help

Re: intrebari/raspunsuri de pe la interviuri

  •  05-28-2007, 10:16 PM

    Re: intrebari/raspunsuri de pe la interviuri

    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

View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems