【问题标题】:How to return zero using Count() with multiple tables如何使用带有多个表的 Count() 返回零
【发布时间】:2010-12-08 02:52:03
【问题描述】:

我有三个表(SQL Server)

月份 - month_id,月份名称,...。

奖项 - award_id,奖项名称,....

提名 - fk_award_idfk_month_id、姓名、地址……

我需要统计每个月授予的不同类型奖励的数量,如果没有人获得奖励,则返回 0

例如。
结果应该看起来像

April-09     Gold         10   
April-09     Silver        2  
April-09     Bronze        0    
May-09       Gold          2   
May-09       Silver        1   
May-09       Bronze        0  

这可能吗?

【问题讨论】:

    标签: sql sql-server tsql join count


    【解决方案1】:

    group by month_id, award_id plus out join 可以解决问题

    【讨论】:

      【解决方案2】:

      你需要这样的东西。未经测试,但原则是存在的:

      SELECT m.Monthname, a.Awardname, COUNT(*)
          FROM Month m
             LEFT JOIN Nomination n ON n.fK_Month_ID = m.MonthID
             LEFT JOIN Award a ON n.FK_Award_ID = a.AwardID
          GROUP BY m.Monthname, a.Awardname
      

      其中的关键是GROUP BY 子句。

      【讨论】:

        【解决方案3】:

        一些要测试的数据:

        DECLARE @months TABLE
        ( month_id INT IDENTITY,
        month_name VARCHAR(50)
        )
        
        INSERT INTO @months(month_name) VALUES ('April-09')
        INSERT INTO @months(month_name) VALUES ('May-09')
        
        DECLARE @awards TABLE
        ( award_id INT IDENTITY,
        award_name VARCHAR(50)
        )
        
        INSERT INTO @awards(award_name) VALUES ('Bronze')
        INSERT INTO @awards(award_name) VALUES ('Silver')
        INSERT INTO @awards(award_name) VALUES ('Gold')
        
        DECLARE @nominations TABLE
        ( fk_month_id INT,
        fk_award_id INT,
        other_field VARCHAR(10)
        )
        
        INSERT INTO @nominations(fk_month_id,fk_award_id,other_field) VALUES (1,1,'1')
        INSERT INTO @nominations(fk_month_id,fk_award_id,other_field) VALUES (1,1,'2')
        INSERT INTO @nominations(fk_month_id,fk_award_id,other_field) VALUES (2,2,'3')
        INSERT INTO @nominations(fk_month_id,fk_award_id,other_field) VALUES (2,1,'4')
        INSERT INTO @nominations(fk_month_id,fk_award_id,other_field) VALUES (3,1,'5')
        INSERT INTO @nominations(fk_month_id,fk_award_id,other_field) VALUES (3,2,'6')
        INSERT INTO @nominations(fk_month_id,fk_award_id,other_field) VALUES (3,2,'7')
        

        还有查询

        SELECT month_name, award_name, ISNULL(cnt,0) 
        FROM @months
        CROSS JOIN @awards
        LEFT JOIN ( 
            SELECT fk_month_id,fk_award_id, COUNT(*) AS cnt
            FROM @nominations 
            GROUP BY fk_month_id,fk_award_id
        ) fk ON fk_month_id = month_id AND fk_award_id = award_id
        

        结果是:

        April-09  Bronze  2
        April-09  Silver  0
        April-09  Gold    0
        May-09    Bronze  1
        May-09    Silver  1
        May-09    Gold    0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-06
          • 1970-01-01
          • 2011-11-29
          • 2016-10-08
          • 1970-01-01
          • 2017-11-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多