• Use of a cursor for calculation of the median (financial or statistical ?) ???

    CREATE TABLE #dist (c1 int)

    INSERT INTO #dist VALUES (2)

    INSERT INTO #dist VALUES (3)

    INSERT INTO #dist VALUES (1)

    INSERT INTO #dist VALUES (4)

    INSERT INTO #dist VALUES (8)

    INSERT INTO #dist VALUES (9)

    SELECT Median=CASE COUNT(*)%2

       WHEN 0 THEN

        (d.c1+MIN(CASE WHEN i.c1>d.c1 THEN i.c1 ELSE NULL END))/2.0

       ELSE d.c1 END  -- Odd number

    FROM #dist d CROSS JOIN #dist i

    GROUP BY d.c1

    HAVING COUNT(CASE WHEN i.c1 <= d.c1 THEN 1 ELSE NULL END)=(COUNT(*)+1)/2

    DROP TABLE #dist

    Median             

    -------------------

    3.500000

    or if there are duplicate values

    set nocount on

    CREATE TABLE #dist (c1 int)

    INSERT #dist VALUES (2)

    INSERT #dist VALUES (2)

    INSERT #dist VALUES (1)

    INSERT #dist VALUES (5)

    INSERT #dist VALUES (5)

    INSERT #dist VALUES (9)

    SELECT Median=ISNULL((CASE WHEN COUNT(CASE WHEN i.c1<=d.c1 THEN 1 ELSE NULL END) > (COUNT(*)+1)/2 THEN 1.0*d.c1 ELSE NULL END)+COUNT(*)%2,

                  (d.c1+MIN((CASE WHEN i.c1>d.c1 THEN i.c1 ELSE NULL END)))/2.0)

    FROM #dist d CROSS JOIN #dist i

    GROUP BY d.c1

    HAVING (COUNT(CASE WHEN i.c1 <= d.c1 THEN 1 ELSE NULL END)>=(COUNT(*)+1)/2)

    AND (COUNT(CASE WHEN i.c1 >=d.c1 THEN 1 ELSE NULL END) >= COUNT(*)/2+1)

    GO

    drop table #dist

    Median          

    ----------------

    3.5

    There are many other ways possible. None of them utillizes a cursor.

     

    --
    Frank Kalis
    Microsoft SQL Server MVP
    Webmaster: http://www.insidesql.org/blogs
    My blog: http://www.insidesql.org/blogs/frankkalis/[/url]