有如下的两个表
表一
类别ID    类别名
1 类别一
2 类别二
3 类别三
4 类别四
5 类别五表二
ID 类别ID 公司名
1 1 公司A
2 1 公司B
3 2 公司C
4 1 公司D
5 2 公司E
6 1 公司F
7 3 公司G
8 3 公司H
9 3 公司I
10 4 公司J
11 1 公司K
现在要求实现如下的结果:类别ID 类别名 公司数量
1 类别一 5
3 类别三 3
2 类别二 2
4 类别四 1
5 类别五 0我用了如下的语句:
SELECT 表一.类别名, 表一.类别ID, COUNT(表二.类别ID) AS aa
FROM 表二 INNER JOIN 表一 ON 表二.类别ID = 表一.类别ID
GROUP BY 表二.类别ID, 表一.类别名, 表一.类别ID
ORDER BY COUNT(表二.类别ID) DESC可以实现按数量倒排序,但问题是如果某个类别在表二中还没有相应的数据,那这个类别就查不到,现在的结果如下:类别ID 类别名 公司数量
1 类别一 5
3 类别三 3
2 类别二 2
4 类别四 1类别五就查不到数据,请教如何改变语句达到真正的效果

解决方案 »

  1.   

    SELECT 表一.类别名, 表一.类别ID, ISNULL(COUNT(表二.类别ID),0) AS aa 
    FROM 表二 LEFT JOIN 表一 ON 表二.类别ID = 表一.类别ID 
    GROUP BY 表二.类别ID, 表一.类别名, 表一.类别ID 
    ORDER BY COUNT(表二.类别ID) DESC 
      

  2.   

    SELECT 表一.类别名, 表一.类别ID, COUNT(表二.类别ID) AS aa
    FROM 表二 RIGHT JOIN 表一 ON 表二.类别ID = 表一.类别ID
    GROUP BY 表二.类别ID, 表一.类别名, 表一.类别ID
    ORDER BY COUNT(表二.类别ID) DESC 
      

  3.   


    SELECT 表一.类别名, 表一.类别ID, ISNULL(COUNT(表二.类别ID),0) AS aa 
    FROM 表二 LEFT JOIN 表一 ON 表二.类别ID = 表一.类别ID 
    GROUP BY 表二.类别ID, 表一.类别名, 表一.类别ID 
    ORDER BY COUNT(表二.类别ID) DESC 
      

  4.   

    -------------------------------------------
    --  Author: liangCK 小梁 & angellan 兰儿
    --  Commen: 小梁 爱 兰儿
    --  Date  : 2009-05-29 09:53:55
    -------------------------------------------
     
    --> 生成测试数据: @tb1
    DECLARE @tb1 TABLE (类别ID INT,类别名 VARCHAR(6))
    INSERT INTO @tb1
    SELECT 1,'类别一' UNION ALL
    SELECT 2,'类别二' UNION ALL
    SELECT 3,'类别三' UNION ALL
    SELECT 4,'类别四' UNION ALL
    SELECT 5,'类别五'
     
    --> 生成测试数据: @tb2
    DECLARE @tb2 TABLE (ID INT,类别ID INT,公司名 VARCHAR(5))
    INSERT INTO @tb2
    SELECT 1,1,'公司A' UNION ALL
    SELECT 2,1,'公司B' UNION ALL
    SELECT 3,2,'公司C' UNION ALL
    SELECT 4,1,'公司D' UNION ALL
    SELECT 5,2,'公司E' UNION ALL
    SELECT 6,1,'公司F' UNION ALL
    SELECT 7,3,'公司G' UNION ALL
    SELECT 8,3,'公司H' UNION ALL
    SELECT 9,3,'公司I' UNION ALL
    SELECT 10,4,'公司J' UNION ALL
    SELECT 11,1,'公司K'--SQL查询如下:SELECT A.类别名, A.类别ID, ISNULL(COUNT(B.类别ID),0) AS aa 
    FROM @tb1 AS A 
        LEFT JOIN @tb2 AS B
     ON A.类别ID = B.类别ID 
    GROUP BY A.类别ID, A.类别名
    ORDER BY COUNT(B.类别ID) DESC /*
    类别名    类别ID        aa
    ------ ----------- -----------
    类别一    1           5
    类别三    3           3
    类别二    2           2
    类别四    4           1
    类别五    5           0
    (5 row(s) affected)
    */
      

  5.   


    SELECT 表一.类别名, 表一.类别ID, COUNT(表二.类别ID) AS aa
    FROM 表二 RIGHT JOIN 表一 ON 表二.类别ID = 表一.类别ID
    GROUP BY 表一.类别名, 表一.类别ID
    ORDER BY COUNT(表二.类别ID) DESC 
      

  6.   

    谢谢大家,问题解决,看来还是没学好啊,left join和right join的问题
    再次谢谢大家
      

  7.   


    我用了如下的语句: 
    SELECT 表一.类别名, 表一.类别ID, isnull(COUNT(表二.类别ID),0) AS aa 
    FROM 表二 INNER JOIN 表一 ON 表二.类别ID = 表一.类别ID 
    GROUP BY 表二.类别ID, 表一.类别名, 表一.类别ID 
    ORDER BY COUNT(表二.类别ID) DESC