【问题标题】:Retrieving monthly data for different types检索不同类型的月度数据
【发布时间】:2011-04-04 14:16:01
【问题描述】:

我正在处理需要检索的报告

  • 所有员工
  • 本月新增内容
  • 今年新增内容
  • 本月终止
  • 今年终止

所有这些都按部门划分(新营销人员、新销售人员等)。

总共大约有 23 列..

我通过使用更新填充每个字段来使用临时表。这是我正在做的一个简化示例。 Employee 表有大部分需要的值(hiredate、termdate 等)。每次更新实际上都有一个连接和更多条件。

update #tmptbl
set MtdHiresSales = select count(empid) from emp e where e.dept = 012 
                           and hiredate between start_of_month() and getdate()
                           -- more predicates
set MtdHiresMkting = ...repeat... with e.dept=013

我确信有更好的方法,因为有很多代码重复。在这种情况下临时表是否合适?我不确定如果没有它怎么能做到。有什么建议吗?

【问题讨论】:

  • 所以有一个员工表,其中包含 empId、dept、hiredate、terminationDate 列?
  • 主要是。我必须加入另一个表才能获得部门(基于 empid)。

标签: sql sql-server tsql


【解决方案1】:

您可能可以为此使用CASE。例如:

SELECT 
SUM(CASE WHEN e.dept=012 
    AND Hiredate between Start_of_Month() and Getdate() 
    AND... 
    THEN 1 ELSE 0 END) AS 'MtdHiresSales',
...
FROM ...
WHERE ...

【讨论】:

  • SUM(CASE WHEN x THEN y ELSE 0 END) 是数据透视的好方法 :)
  • @Dems - 这是我最常用的台词之一!
  • 我没有想到这个选项。谢谢,这样就可以了。
【解决方案2】:

您可以使用公用表表达式来封装员工计数代码...

WITH
  employee_counts
AS
(
   SELECT
     dept         AS "dept",
     x            AS "x",
     COUNT(empid) AS "employees"
   FROM
     emp
   WHERE
     hiredate BETWEEN start_of_month() AND getdate()
     -- etc, etc
   GROUP BY
     dept,
     x
)
UPDATE
  myTable
SET
  MtdHiresSales  = (SELECT employees FROM employee_counts WHERE dept = 012 AND x = myTable.y),
  MtdHiresMkting = (SELECT employees FROM employee_counts WHERE dept = 013 AND x = myTable.y)

【讨论】:

  • 谢谢,我可能最终会在我正在处理的另一份报告中使用类似的内容。
【解决方案3】:

也许我很困惑或没有看到什么,但为什么不直接使用聚合呢?

SELECT count(*) as employeesPerDept, deptId
from mudkips
group by deptId

给予(我的样本数据)

employeesPerDept    deptId
6                   100
4                   200

select deptId, count(*) as empsHired, month(hiredate) as monthHired, 
year(hireDate) as yearHired
from mudkips
group by deptId, month(hireDate), year(hireDate)

然后是

deptId  empsHired   monthHired  yearHired
100         4           1           2010
100         1           1           2011
100         1           2           2010
200         2           1           2010
200         1           2           2010
200         1           3           2010

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-11
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2018-05-30
    • 1970-01-01
    相关资源
    最近更新 更多