上面的语句貌似有点问题,正确的应该为:
SELECT Sales Median FROM 
(SELECT a1.Name, a1.Sales, COUNT(a1.Sales) Rank 
FROM Total_Sales a1, Total_Sales a2 
WHERE a1.Sales < a2.Sales OR (a1.Sales=a2.Sales AND a1.Name <= a2.Name) 
group by a1.Name, a1.Sales 
) a3 
WHERE Rank = (SELECT (COUNT(*)+1)/2 FROM Total_Sales); --下面看看过程
--1.先按照sales大小排名,如果sales相同,则按name排名
SELECT a1.Name, a1.Sales, COUNT(a1.Sales) Rank 
FROM Total_Sales a1, Total_Sales a2 
WHERE a1.Sales < a2.Sales OR (a1.Sales=a2.Sales AND a1.Name <= a2.Name) 
group by a1.Name, a1.Sales 
/**
Name                 Sales       Rank        
-------------------- ----------- ----------- 
John                 10          6
Jennifer             15          5
Jeff                 20          4
Stella               20          3
Sophia               40          2
Greg                 50          1(所影响的行数为 6 行)
**/--2.从做好排名的表中找出排名位于总数中间的记录
/**
Name                 Sales       Rank        
-------------------- ----------- ----------- 
Stella               20          3
**/

解决方案 »

  1.   

    太厉害了,其中的“SELECT a1.Name, a1.Sales” a1是什么意思呢
      

  2.   

    表  Total_Sales 的别名.
      

  3.   

    为什么记录总数是偶数时,不是两天记录?Jeff                 20          4
    Stella               20          3
      

  4.   


    1楼正解
    SELECT (COUNT(*)+1)/2 FROM Total_Sales
    返回的 只用一个数据啊,不知楼主的最中间是不是次数字
      

  5.   

    如果只要1条,可以这么写:
    select Top 1 Sales, [Name] from
    ( select Top 50 percent * from Total_Sales order by Sales, [Name]) T
    order by Sales desc, [Name] desc
      

  6.   

    ;with t
    as(select *,rank = row_number() over (order by sales,name)
       from total_sales
    ),
    t1
    as
    (select cast(max(rank) as numeric(12,2)) as c from t)
    select * from t1,t
    where  abs(rank  - c/2 ) < 1
      

  7.   

    谢谢楼上,我用的是MSSQL2000,RANK功能只是在2005上用的,我这里好象用不了
      

  8.   

    谢谢楼上,我用的是MSSQL2000,RANK功能只是在2005上用的,我这里好象用不了
      

  9.   

    按照中位数的定义,如果有偶数条数据,应该取中间两个数的平均数,所以:declare  @Total_Sales table (
    Name varchar(10),
    Sales numeric(10,2)
    )
    insert @Total_Sales select
    'John', 10 
    union all select
    'Jennifer', 15 
    union all select
    'Stella', 20 
    union all select
    'Sophia', 40 
    union all select
    'Greg', 50 
    union all select
    'Jeff', 18 SELECT avg(Sales) Median FROM 
    (SELECT a1.Name, a1.Sales, COUNT(a1.Sales) Rank 
    FROM @Total_Sales a1, @Total_Sales a2 
    WHERE a1.Sales < a2.Sales OR (a1.Sales=a2.Sales AND a1.Name <= a2.Name) 
    group by a1.Name, a1.Sales 
    ) a3 
    WHERE abs(Rank - (SELECT 1.0*(COUNT(*)+1)/2 FROM @Total_Sales))<1
     
    -- 结果
    Median                                   
    ---------------------------------------- 
    19.000000(所影响的行数为 1 行)
      

  10.   

    奇数条数declare  @Total_Sales table (
    Name varchar(10),
    Sales numeric(10,2)
    )
    insert @Total_Sales select
    'John', 10 
    union all select
    'Jennifer', 15 
    union all select
    'Sophia', 40 
    union all select
    'Greg', 50 
    union all select
    'Jeff', 18 SELECT avg(Sales) Median FROM 
    (SELECT a1.Name, a1.Sales, COUNT(a1.Sales) Rank 
    FROM @Total_Sales a1, @Total_Sales a2 
    WHERE a1.Sales < a2.Sales OR (a1.Sales=a2.Sales AND a1.Name <= a2.Name) 
    group by a1.Name, a1.Sales 
    ) a3 
    WHERE abs(Rank - (SELECT 1.0*(COUNT(*)+1)/2 FROM @Total_Sales))<1
     --结果
    Median                                   
    ---------------------------------------- 
    18.000000(所影响的行数为 1 行)