SELECT     a.PositionId, a.PositionName, COUNT(b.RecruitId) AS jNum
FROM         dbo.PositionTbl AS a INNER JOIN
                      dbo.RecruitTbl AS b ON b.Position_s = a.PositionName
WHERE     (b.Position_b = 'A分类') AND (a.PositionKey = 1)
GROUP BY a.PositionId, a.PositionName显示结果为:
PositionId PositionName jNum
1       A1分类     23我想要的结果是
PositionId PositionName jNum
1       A1分类     23
2       A2分类     0
3       A3分类     0
4       A4分类     0
5       A5分类     0怎么才能把0的也显示出来。。顺便帮忙优化一下SQL语句。。本人不太熟悉SQL。。

解决方案 »

  1.   

    SELECT  a.PositionId ,
            a.PositionName ,
            ISNULL(COUNT(b.RecruitId),0) AS jNum
    FROM    dbo.PositionTbl AS a
            LEFT JOIN dbo.RecruitTbl AS b
    ON b.Position_s = a.PositionName
    WHERE   ( b.Position_b = 'A分类' )
            AND ( a.PositionKey = 1 )
    GROUP BY a.PositionId ,
            a.PositionName
      

  2.   

    inner join 改成left join ,至于优化:1、贴出执行计划出来看看。
    2、b.Position_s = a.PositionName
    WHERE     (b.Position_b = 'A分类') AND (a.PositionKey = 1)这里用到的字段加上非聚集索引试试
      

  3.   

    RecruitTbl表
    PositionTbl表
    有点类似于招聘的分类。。一级类别下面要列出二级类别。。要算出二级类别有多少条信息
      

  4.   

    最好你能够帖出 dbo.PositionTbl ,dbo.RecruitTbl 两表的完整结构SELECT  a.PositionId , a.PositionName , ISNULL(COUNT(b.RecruitId),0) AS jNum
    FROM  dbo.PositionTbl a
    LEFT JOIN dbo.RecruitTbl b ON b.PositionId = a.PositionId   -->应该用PositionId 关联
    WHERE   ( b.Position_b = 'A分类' ) AND ( a.PositionKey = 1 )
    GROUP BY a.PositionId ,a.PositionName
      

  5.   

    PositionId PositionName PositionKey Px
    14 建筑工程 1 1
    15 市政公用 1 2
    16 机电工程 1 3
    17 公路工程 1 4
    18 水利水电 1 5
    19 矿业工程 1 6
    20 港口与航道 1 7
    21 通信与广电 1 8
    22 铁路工程 1 9
    23 民航机场 1 10RecruitId Position_b Position_s JobName
    1 一级建造师 机电工程 北京企业寻建造师挂靠
    2 一级建造师 机电工程 高薪诚聘一级房建建造师 绝对安全 和市政 机电专业
    3 一级建造师 机电工程 成都企业 诚聘二级房建 初始证书 若干
    4 一级建造师 机电工程 高薪诚聘一级房建建造师 绝对安全 和市政 机电专业
    5 一级建造师 机电工程 高薪诚聘一级房建建造师 绝对安全 和市政 机电专业这样行不~~
      

  6.   


    我也想用PositionId关联。。主要是关联人家设置了Position_b和Position_s。。我修改不到。。
      

  7.   

    if OBJECT_ID('tempdb..#tempA', 'u') is not null   drop table #tempA;
    go
    create table #tempA( [PositionId] varchar(100), [PositionName] varchar(100), [PositionKey] varchar(100), [Px] varchar(100));
    insert #tempA
    select '14','建筑工程','1','1' union all
    select '15','市政公用','1','2' union all
    select '16','机电工程','1','3' union all
    select '17','公路工程','1','4' union all
    select '18','水利水电','1','5' union all
    select '19','矿业工程','1','6' union all
    select '20','港口与航道','1','7' union all
    select '21','通信与广电','1','8' union all
    select '22','铁路工程','1','9' union all
    select '23','民航机场','1','10' if OBJECT_ID('tempdb..#tempB', 'u') is not null   drop table #tempB;
    go
    create table #tempB( [RecruitId] int, [Position_b] varchar(100), [Position_s] varchar(100), [JobName] varchar(100));
    insert #tempB
    select '1','一级建造师','机电工程','北京企业寻建造师挂靠' union all
    select '2','一级建造师','机电工程','高薪诚聘一级房建建造师 绝对安全 和市政 机电专业' union all
    select '3','一级建造师','机电工程','成都企业 诚聘二级房建 初始证书 若干' union all
    select '4','一级建造师','机电工程','高薪诚聘一级房建建造师 绝对安全 和市政 机电专业' union all
    select '5','一级建造师','机电工程','高薪诚聘一级房建建造师 绝对安全 和市政 机电专业' --SQL:
    SELECT  a.PositionId ,
            a.PositionName ,
            COUNT(b.RecruitId) AS jNum
    FROM    #tempA AS a
            LEFT JOIN #tempB AS b 
    ON b.Position_s = a.PositionName
    AND b.Position_b = '一级建造师'
    WHERE   a.PositionKey = 1
    GROUP BY a.PositionId ,
            a.PositionName
    /*
    PositionId PositionName jNum
    20 港口与航道 0
    17 公路工程 0
    16 机电工程 5
    14 建筑工程 0
    19 矿业工程 0
    23 民航机场 0
    15 市政公用 0
    18 水利水电 0
    22 铁路工程 0
    21 通信与广电 0
    */
      

  8.   

    SELECT  a.PositionId ,
            a.PositionName ,
            COUNT(b.RecruitId) AS jNum
    FROM    #tempA AS a
            LEFT JOIN #tempB AS b 
    ON b.Position_s = a.PositionName
    AND b.Position_b = '一级建造师'
    WHERE   a.PositionKey = 1
    GROUP BY a.PositionId ,
            a.PositionName
    ORDER BY COUNT(b.RecruitId) DESC --是这意思?
      

  9.   

    SELECT  a.PositionId ,
            a.PositionName ,
            COUNT(b.RecruitId) AS jNum
    FROM    #tempA AS a
            LEFT JOIN #tempB AS b 
    ON b.Position_s = a.PositionName
    AND b.Position_b = '一级建造师'
    WHERE   a.PositionKey = 1
    GROUP BY a.PositionId ,
            a.PositionName
    ORDER BY COUNT(b.RecruitId) DESC --是这意思?#tempA这里应该还有一列叫px的。。用来排序用的。。顺带问一下。。group by之后可以用order by ?
      

  10.   

    --当然可以排序。ORDER BY是所有SQL中,最后一步。
    SELECT  a.PositionId ,
            a.PositionName ,
            COUNT(b.RecruitId) AS jNum
    FROM    #tempA AS a
            LEFT JOIN #tempB AS b 
    ON b.Position_s = a.PositionName
    AND b.Position_b = '一级建造师'
    WHERE   a.PositionKey = 1
    GROUP BY a.PositionId ,
            a.PositionName
    ORDER BY MIN(a.px) --试试,哎,兄弟,你不给数据,让大家猜呀 ^_^
      

  11.   

    SORRY啊,刚才看见PX了。呵呵
    我的例子中是varchar类型,可能会有点儿问题。如果是INT类型,就没问题了
      

  12.   

    --当然可以排序。ORDER BY是所有SQL中,最后一步。
    SELECT  a.PositionId ,
            a.PositionName ,
            COUNT(b.RecruitId) AS jNum
    FROM    #tempA AS a
            LEFT JOIN #tempB AS b 
    ON b.Position_s = a.PositionName
    AND b.Position_b = '一级建造师'
    WHERE   a.PositionKey = 1
    GROUP BY a.PositionId ,
            a.PositionName
    ORDER BY MIN(a.px) --试试,哎,兄弟,你不给数据,让大家猜呀 ^_^冤枉啊。。我给了。。在上面有的~~~~