数据库里结构大概是这样的产品号      产品名                         所属品牌    访问量      
305 紫光 8850ED                   紫光 13785
1381 DELL LATITUDE L400(10GB/24XCD) DELL 8542
1387 DELL LATITUDE L400(20GB/8XDVD) DELL 3542
11119 联想 昭阳2110CF                   联想 58954
14913 DELL LATITUDE C600           DELL 5468
16065 联想 昭阳K21                   联想 210
16876 SONY GR18C                   SONY 0
17370 DELL 38N2-14 85C                   DELL 125
19001 DELL LATITUDE C810           DELL 3986
20402 联想 昭阳S280CFe                   联想 1578
我要实现的功能是,找出这样的产品,他们是每一个品牌的访问量前3位的产品(访问量从高到底),
这些产品找出后,优先按访问量从高到低显示(注意,是访问量前3位按访问量显示,不是按品牌或产品名显示)
剩下的产品,统一按访问量从高到低显示
在线等候,谢谢

解决方案 »

  1.   


    with reny
    (select *, CN=ROW_NUMBER() OVER (PARTITION BY 所屬品牌 ORDER BY 訪問量)  
     from Tb
    )
    select * from reny where cn<=3
      

  2.   

    忘了说了,我用的SQL SERVER2000,呵呵
      

  3.   


    下麵的是SQL2000的寫法
    select * from
    (select top 3 * from
    (select *,num=(select count(*) from tb a where a.品牌=b.品牌 and a.訪問量<b.訪問量) from tb b) reny
    order by num desc) a
    order by num
      

  4.   

    --SQL 2000
    SELECT *
    FROM TB T
    WHERE (SELECT COUNT(1)+1 FROM TB WHERE 所属品牌=t.所属品牌 and 访问量>t.访问量)<=3
    ORDER BY 访问量 DESC
      

  5.   

    to:ks_reny 
    select * from
    (select top 3 * from
    (select *,num=(select count(*) from tb a where a.品牌=b.品牌 and a.訪問量<b.訪問量) from tb b) reny
    order by num desc) a
    order by num这个好像是按照 品牌数排列的,不是按产品的访问量排列的to:ai_li7758521 
    SELECT * 
    FROM TB T 
    WHERE (SELECT COUNT(1)+1 FROM TB WHERE 所属品牌=t.所属品牌 and 访问量>t.访问量) <=3 
    ORDER BY 访问量 DESC 这句不错啊,能把每个品牌的前3位找出来,并最后按访问量排序 
    不过还需要一句话,就是剩下的产品(不是前3位的),直接按访问量排序(没有刚才第一步 
    “把每个品牌的前3位找出来,并最后按访问量排序” 
    优先级高,也就是说这个选择出来的,永远在第一步排好的后面 
      

  6.   

    ---------------------------------
    --  Author: liangCK 小梁
    --  Title : 查每个分组前N条记录
    --  Date  : 2008-11-13 17:19:23
    ---------------------------------
     
    --> 生成测试数据: #T
    IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
    CREATE TABLE #T (ID VARCHAR(3),GID INT,Author VARCHAR(29),Title VARCHAR(39),Date DATETIME)
    INSERT INTO #T
    SELECT '001',1,'邹建','深入浅出SQLServer2005开发管理与应用实例','2008-05-10' UNION ALL
    SELECT '002',1,'胡百敬','SQLServer2005性能调校','2008-03-22' UNION ALL
    SELECT '003',1,'格罗夫Groff.J.R.','SQL完全手册','2009-07-01' UNION ALL
    SELECT '004',1,'KalenDelaney','SQLServer2005技术内幕存储引擎','2008-08-01' UNION ALL
    SELECT '005',2,'Alex.Kriegel.Boris.M.Trukhnov','SQL宝典','2007-10-05' UNION ALL
    SELECT '006',2,'飞思科技产品研发中心','SQLServer2000高级管理与开发','2007-09-10' UNION ALL
    SELECT '007',2,'胡百敬','SQLServer2005数据库开发详解','2008-06-15' UNION ALL
    SELECT '008',3,'陈浩奎','SQLServer2000存储过程与XML编程','2005-09-01' UNION ALL
    SELECT '009',3,'赵松涛','SQLServer2005系统管理实录','2008-10-01' UNION ALL
    SELECT '010',3,'黄占涛','SQL技术手册','2006-01-01'--SQL查询如下:--按GID分组,查每个分组中Date最新的前2条记录
    --1.字段ID唯一时:
    SELECT * FROM #T AS T WHERE ID IN(SELECT TOP 2 ID FROM #T WHERE GID=T.GID ORDER BY Date DESC)--2.如果ID不唯一时:
    SELECT * FROM #T AS T WHERE 2>(SELECT COUNT(*) FROM #T WHERE GID=T.GID AND Date>T.Date)--SQL Server 2005 使用新方法--3.使用ROW_NUMBER()进行排位分组
    SELECT ID,GID,Author,Title,Date
    FROM
    (
       SELECT rid=ROW_NUMBER() OVER(PARTITION BY GID ORDER BY Date DESC),*
       FROM #T
    ) AS T
    WHERE rid<=2--4.使用APPLY
    SELECT DISTINCT b.*
    FROM #T AS a
    CROSS APPLY
    (
        SELECT TOP(2) * FROM #T WHERE a.GID=GID ORDER BY Date DESC
    ) AS b
    --结果
    /*ID   GID         Author                        Title                                   Date
    ---- ----------- ----------------------------- --------------------------------------- -----------------------
    003  1           格罗夫Groff.J.R.                 SQL完全手册                                 2009-07-01 00:00:00.000
    004  1           KalenDelaney                  SQLServer2005技术内幕存储引擎                   2008-08-01 00:00:00.000
    005  2           Alex.Kriegel.Boris.M.Trukhnov SQL宝典                                   2007-10-05 00:00:00.000
    007  2           胡百敬                           SQLServer2005数据库开发详解                    2008-06-15 00:00:00.000
    009  3           赵松涛                           SQLServer2005系统管理实录                     2008-10-01 00:00:00.000
    010  3           黄占涛                           SQL技术手册                                 2006-01-01 00:00:00.000(6 行受影响)
    */
      

  7.   

    既然已经找出每组的访问量最多的3个出来..
    那最后加一个 ORDER BY 访问量 DESC 就可以了
      

  8.   

    我思路弄反了.select top 3 * from 
    (select *,num=(select count(*) from tb a where a.品牌=b.品牌 and a.訪問量 >b.訪問量) from tb b) reny    ----此處修改為>號.
    order by num
      

  9.   


    select top 3 * from 
    (select *,num=(select count(*) from tb a where a.品牌=b.品牌 and a.訪問量 >b.訪問量) from tb b) reny   
    ----此處修改一下為>,我把思路弄反了.
    order by num
      

  10.   


    create table product
    (
        产品号 char(20) ,
        产品名 char(60) ,
        所属品牌 char(20) ,
        访问量 int
    )
    -------------------------------------------------------------
    insert  product
    select '305', '紫光 8850ED','紫光', 13785 
    insert  product
    select '1381', 'DELL LATITUDE L400(10GB/24XCD)', 'DELL', 8542 
    insert  product
    select '1387', 'DELL LATITUDE L400(20GB/8XDVD)' ,'DELL', 3542 
    insert  product
    select '11119', '联想 昭阳2110CF'             ,      '联想' ,58954 
    insert  product
    select '14913', 'DELL LATITUDE C600'          ,'DELL', 5468 
    insert  product
    select '16065', '联想 昭阳K21'                 ,  '联想', 210 
    insert  product
    select '16876', 'SONY GR18C'                  , 'SONY', 0 
    insert  product
    select '17370', 'DELL 38N2-14 85C'            ,       'DELL', 125 
    insert  product
    select '19001', 'DELL LATITUDE C810'          ,'DELL' ,3986 
    insert  product
    select '20402', '联想 昭阳S280CFe'             ,      '联想', 1578 
    -------------------------------------------------------------------
    1381     DELL LATITUDE L400(10GB/24XCD)       DELL              8542
    1387     DELL LATITUDE L400(20GB/8XDVD)       DELL              3542
    14913    DELL LATITUDE C600                   DELL              5468
    17370    DELL 38N2-14 85C                     DELL              125
    19001    DELL LATITUDE C810                   DELL              3986
    16876    SONY GR18C                           SONY              0
    16065    联想 昭阳K21                          联想                 210
    11119    联想 昭阳2110CF                       联想                 58954
    20402    联想 昭阳S280CFe                      联想                 1578
    305      紫光 8850ED                           紫光                 13785
    ---------------------------------------------------------select A.[所属品牌],A.[访问量]  from product A
    where A.[产品号] in
    (
    select top 3 B.[产品号] from product B
            where A.[所属品牌]=B.[所属品牌]
            
    )
    order by [所属品牌],[访问量] desc
    --结果--------------------------------------------------
    所属品牌                  访问量
    ---------          -------------
    DELL                 8542
    DELL                 5468
    DELL                 3542
    SONY                 0
    联想                 58954
    联想                 1578
    联想                 210
    紫光                 13785
      

  11.   


    declare @tb table (产品号 int,产品名 nvarchar(100),所属品牌 nvarchar(100),访问量 int)
    insert into @tb select 305,'紫光8850ED','紫光',13785
          union all select 1381,'DELL LATITUDEL400(10GB/24XCD)','DELL',8542
          union all select 1387,'DELL LATITUDEL400(20GB/8XDVD)','DELL',3542
          UNION ALL select 11119,'联想昭阳2110CF','联想',58984
          UNION ALL SELECT 14913,'DELL LATITUDE C600','DELL',5468
          UNION ALL SELECT 16065,'联想昭阳K21','联想',210
          union all select 16876,'SONYGR18C','SONY',0
          UNION ALL SELECT 17370,'DELL38N2-14 85C','DELL',125
          union all select 19001,'DELLLATITUDE C810','DELL',3986
          union all select 20402,'联想昭阳S280CFe','联想',1578
    select * from @tb a where 3>
            (select COUNT(*) from @tb where 所属品牌=a.所属品牌 and 访问量>a.访问量)
            order by 所属品牌(10 行受影响)
    产品号         产品名                                                                                                  所属品牌                                                                                                 访问量
    ----------- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- -----------
    1381        DELL LATITUDEL400(10GB/24XCD)                                                                        DELL                                                                                                 8542
    14913       DELL LATITUDE C600                                                                                   DELL                                                                                                 5468
    19001       DELLLATITUDE C810                                                                                    DELL                                                                                                 3986
    16876       SONYGR18C                                                                                            SONY                                                                                                 0
    20402       联想昭阳S280CFe                                                                                          联想                                                                                                   1578
    16065       联想昭阳K21                                                                                              联想                                                                                                   210
    11119       联想昭阳2110CF                                                                                           联想                                                                                                   58984
    305         紫光8850ED                                                                                             紫光                                                                                                   13785(8 行受影响)