请教我有两个两个数据表a表aid(主键,自动)    bid
1                  2
2                  3
3                  1
4                  2
5                  1 
6                  4 
7                  1 
8                  4 
9                  2 
...
b表bid(主键,自动)   bname
1                  我
2                  小麦
3                  小刘
4                  小王
我想读出,在a表中 bid出现次数最多的前 3 名的bname和它对应的bid,并列出他们的出现次数,并按出现次数多少,降序排列,相同次数的,按aid升序排列
如按上面就出现的是我(3次) --  1小麦(3次) -- 2小王(2次) -- 4请问这个SQL语句该怎么写呢?

解决方案 »

  1.   


    select a.bname, isnull(b.total,0) from b表 a left outer join 
    (select bid,count(*) as total from a表 group by bid) b on a.bid=b.bid抢分
      

  2.   

    SET NOCOUNT ON
    DECLARE @A TABLE(AID INT,BID INT)
    INSERT @A SELECT 1,                  2 
    INSERT @A SELECT 2,                  3 
    INSERT @A SELECT 3,                  1 
    INSERT @A SELECT 4,                  2 
    INSERT @A SELECT 5,                  1 
    INSERT @A SELECT 6,                  4 
    INSERT @A SELECT 7,                  1 
    INSERT @A SELECT 8,                  4 
    INSERT @A SELECT 9,                  2 
    DECLARE @B TABLE(BID INT,BNAME NVARCHAR(10))
    --bid(主键,自动)  bname 
    INSERT @B SELECT 1  ,                N'我' 
    INSERT @B SELECT 2 ,                 N'小麦' 
    INSERT @B SELECT 3 ,                 N'小刘' 
    INSERT @B SELECT 4,                  N'小王' 
    SELECT TOP 3 BNAME=M.BNAME+'('+LTRIM(CNT)+'次)',BID FROM @B M INNER JOIN
    (SELECT B.BNAME,COUNT(*)CNT FROM @A A INNER JOIN @B B ON A.BID=B.BID GROUP BY B.BNAME)N
    ON M.BNAME=N.BNAME
    ORDER BY N.CNT DESC
    /*BNAME                      BID         
    -------------------------- ----------- 
    小麦(3次)                     2
    我(3次)                      1
    小王(2次)                     4
    */