表:sales
product    det     sales_qty
A         部門1        100
A         部門2        80
A         部門3        60
A         部門4        40
B         部門1        40
B         部門2        60
B         部門3        80
B         部門4        100
....
現在想取各種產品在各部門銷售數量最高的前2個部門,如何取?

解决方案 »

  1.   

    select top 2 det,sum(sales_qty) as sales_sum
    from   ****
    group by det
    order by sales_sum desc
      

  2.   

    SQL不不是特别复杂,但是数据库设计就不太好了,看看这个SELECT SALES.PRODUCT,DET,SALES_QTY FROM SALES
    ,
    (
    SELECT PRODUCT,MAX(SALES_QTY) AS MAXQTY FROM SALES GROUP BY PRODUCT
    UNION
    SELECT SALES.PRODUCT,MAX(SALES_QTY) FROM SALES LEFT JOIN (SELECT PRODUCT,MAX(SALES_QTY) AS MAXQTY FROM SALES GROUP BY PRODUCT) MAXQTY ON SALES.PRODUCT=MAXQTY.PRODUCT WHERE SALES_QTY<MAXQTY GROUP BY SALES.PRODUCT
    ) SELECTQTY
    WHERE SALES.PRODUCT=SELECTQTY.PRODUCT AND SALES.SALES_QTY=SELECTQTY.MAXQTY
    ORDER BY SALES.PRODUCT,SALES_QTY DESC一条SQL语句而已但是必须基于一点就是同一货品在不同部门之间最大数量或次之数量没有重复数量,否则是无法出现准确结果,说白了就是取第一名及第二名没有并列一说,否则你的数据库得修改
      

  3.   

    create table #t(product varchar(10),det varchar(10), sales_qty int)
    insert #t 
    select 'A','部門1',100
    union all
    select 'A','部門2',80
    union all
    select 'A','部門3',60
    union all 
    select 'A','部門4', 40
    union all 
    select 'B','部門1',40
    union all
    select 'B','部門2',60
    union all
    select 'B','部門3',80
    union all 
    select 'B','部門4', 100--Try It
    select product, det, sales_qty from 
    (
    select t2.det,t2.sales_qty, product,(select count(1) [count] from #t t1 where t2.sales_qty<=t1.sales_qty and t1.product=t2.product) [count]  from #t t2
    ) a
    where count in (1,2)
      

  4.   

    原始表:
    A 部門1 100
    A 部門2 80
    A 部門3 60
    A 部門4 40
    B 部門1 40
    B 部門2 60
    B 部門3 80
    B 部門4 100
    汇总后结果:
    A 部門1 100
    A 部門2 80
    B 部門3 80
    B 部門4 100
      

  5.   

    我试了一下,如果按楼主的数据,楼上的没问题,正如楼上所说,如果有重复数量,就不行.
    我写一个超复杂的,能解决重复数量问题,测试数据:
    +---------+-------+-----------+
    | product | det   | sales_qty |
    +---------+-------+-----------+
    | A       | 部門1 |       100 |
    | A       | 部門2 |        80 |
    | A       | 部門3 |        60 |
    | A       | 部門4 |        40 |
    | B       | 部門1 |        40 |
    | B       | 部門2 |        60 |
    | B       | 部門3 |        80 |
    | B       | 部門4 |       100 |
    | A       | 部門1 |       500 |
    | A       | 部門2 |       150 |
    | A       | 部門3 |       250 |
    | A       | 部門4 |       350 |
    | B       | 部門1 |        40 |
    | B       | 部門2 |        60 |
    | B       | 部門3 |        80 |
    | B       | 部門4 |       100 |
    +---------+-------+-----------+
    先预看一下
    select product,det,sum(sales_qty) as sales_sum
    from   sales                                 
    group by   product,det                               
    +---------+-------+-----------+
    | product | det   | sales_sum |
    +---------+-------+-----------+
    | A       | 部門1 |       600 |
    | A       | 部門2 |       230 |
    | A       | 部門3 |       310 |
    | A       | 部門4 |       390 |
    | B       | 部門1 |        80 |
    | B       | 部門2 |       120 |
    | B       | 部門3 |       160 |
    | B       | 部門4 |       200 |
    +---------+-------+-----------+结果应该为:
    | A       | 部門1 |       600 |
    | A       | 部門4 |       390 |
    | B       | 部門4 |       200 |
    | B       | 部門3 |       160 |最终sql:
    select g.PRODUCT,g.det ,g.SALES_QTY from
    (
    select a.PRODUCT,a.det ,a.SALES_QTY from
     (
      select  PRODUCT,det ,sum(SALES_QTY) as SALES_QTY from sales b group by PRODUCT,det
     ) a,
     (select PRODUCT,max( SALES_QTY )  SALES_QTY from
     (
      select  PRODUCT,det ,sum(SALES_QTY) as SALES_QTY from sales c group by PRODUCT,det
     ) e group by PRODUCT 
     )d
     where a.SALES_QTY =d.SALES_QTY and a.PRODUCT=d.PRODUCTunion
    select h.PRODUCT,h.det,h.SALES_QTY from
    (
      select  PRODUCT,det ,sum(SALES_QTY) as SALES_QTY from sales b group by PRODUCT,det
    ) h,
    (
    select f.PRODUCT ,max(SALES_QTY) as SALES_QTY from
    (
    select a1.PRODUCT,a1.det ,a1.SALES_QTY from
     (
      select  PRODUCT,det ,sum(SALES_QTY) as SALES_QTY from sales b1 group by PRODUCT,det
     ) a1,
     (select PRODUCT, max( SALES_QTY )  SALES_QTY from
     (
      select  PRODUCT,det ,sum(SALES_QTY) as SALES_QTY from sales c1 group by PRODUCT,det
     ) e1 group by PRODUCT 
     ) d1
     where a1.SALES_QTY <d1.SALES_QTY  and a1.PRODUCT=d1.PRODUCT
    ) f
    group by f.PRODUCT
    ) j
    where h.SALES_QTY=j.SALES_QTY
    ) g
    order by  g.PRODUCT,g.SALES_QTY desc
    结果为:
    +---------+-------+-----------+
    | A       | 部門1 |       600 |
    | A       | 部門4 |       390 |
    | B       | 部門4 |       200 |
    | B       | 部門3 |       160 |
    +---------+-------+-----------+
    结果正确(用mysql及sqlserver测试通过)
    只是太复杂,不知能否再优化一下
      

  6.   

    To:楼主
    如果sales_qty相同,部门任意选一个??还是全列出来??如果全列出来的话
    select product,det,sum(sales_qty) As sales_qty  Into #T1 from [#t] group by product,detSelect * from #T1 A Where Not Exists (Select 1 from #T Where product=A.product And sales_qty>A.sales_qty Having Count(*)>1)
    order by 1晕:好像在SQL论坛一样
      

  7.   

    晕死,原来搞了半天楼主都没说明白很多问题1、SALES表是合计表还是明细表,如果是明细表,那还得首先SUM然后再MAX,看楼主的数据是得不到这个说法的,所以上面所有的理解都五花八门,包括此前我写的2、排名重复如何处理?楼主根本没提,这算法可就多了3、大伙都在忙活的时候,LZ反而消失了
      

  8.   

    SORRY..,忙開了。。當天沒解決把這事忘了。。
    感謝大家!
      

  9.   

    在數據庫記錄中,如沒有排名重復的,
    liangpei2008(Crystal) 兄的算法最直接,但是實際上有排名重復,我想在如第一名有幾個重復就隨機的取兩個,反正每產品只取兩個記錄!這樣的話又得重新考慮了。。
      

  10.   

    select product,det,case det when '部門1' then max(sales_qty) 
    when '部門2' then max(sales_qty)
    when '部門3' then max(sales_qty)
    when '部門4' then max(sales_qty)
    end as sales_qty
    from #t group by product,det,sales_qty order by det,sales_qty desc
      

  11.   

    反正就是要取排在最前面的兩個。。不論是否有重復(如第一名有多於兩個重復就隨機取兩個,第一名一個,第二名有多個的隨機取一個第二名)
    反正就是針對N個產品,N個部門
    對每個產品取兩個SALES_QTY最大的。。(前兩位)