没有找到行时,SQL Server 2008返回0

时间:2013-05-01 12:16:11

标签: sql sql-server-2008

我想知道是否有人可以帮助我?

我目前正在从数据库中的统计数据中编写绩效管理报告

我正在计算每个员工每月完成的工作数量,但是,几个月工作人员不会完成任何工作,因此该月没有任何条目。

目前我写道:

SELECT
  CAST(MONTH(s.Date_Entered) AS VARCHAR(2)) + '-' + 
                               CAST(YEAR(s.Date_Entered) AS VARCHAR(4)) AS Month,
  s.staff,
  CASE 
    WHEN COUNT(*) > 0 THEN COUNT (*) 
    ELSE 0 
  END AS Jobs,
  ot.monthly_target AS Target
FROM tb_statistics AS s
LEFT JOIN tb_staff_targets as ot ON (s.staff = ot.staff)
GROUP BY s.staff, 
         CAST(MONTH(s.Date_Entered) AS VARCHAR(2)) + '-' 
                                      + CAST(YEAR(s.Date_Entered) AS VARCHAR(4)),
         ot.monthly_target

现在计数对于0以上的数据工作正常,但是一名工作人员已经添加了一份工作,比如4月那么我希望其他员工显示0,直到他们添加数据等

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

当我读到你的问题时,我想到了这一点:

  • 获取完成的工作总数,按月和员工分组
  • 获取完成工作的月份列表
  • 获取员工列表
  • 进行完全外部联接以将月份与员工合并
  • 组合的左连接与计算的完成的工作总数
  • 使用coalesce将NULL值替换为零

答案 1 :(得分:0)

如果我假设您想要的所有员工都在表tb_staff_targets中,那么您想要将联接的顺序从left join切换为right join

SELECT CAST(MONTH(s.Date_Entered) AS VARCHAR(2)) + '-' + 
                               CAST(YEAR(s.Date_Entered) AS VARCHAR(4)) AS Month,
       s.staff,
       (CASE WHEN COUNT(*) > 0 THEN COUNT (*) 
             ELSE 0 
        END) AS Jobs,
      ot.monthly_target AS Target
FROM tb_statistics s RIGHT JOIN
     tb_staff_targets ot
     ON (s.staff = ot.staff)
GROUP BY s.staff, 
         CAST(MONTH(s.Date_Entered) AS VARCHAR(2)) + '-' 
                                      + CAST(YEAR(s.Date_Entered) AS VARCHAR(4)),
         ot.monthly_target

这将保留员工表(所有员工)中的所有内容及其统计信息。

如果工作人员不在此表中,那么您需要一些来源,以获得值0的员工列表。