Получение ежемесячных данных для разных типов - PullRequest
1 голос
/ 04 апреля 2011

Я работаю над отчетом, который нужно получить

  • все сотрудники
  • новых дополнений в этом месяце
  • новых дополнений в этом году
  • прекращений в этом месяце
  • прекращение в этом году

Все они разделены по отделам (новые сотрудники отдела маркетинга, новые продажи и т. Д.).

Всего будет около 23 столбцов.

Я использую временную таблицу, заполняя каждое поле обновлением. Вот упрощенный пример того, что я делаю. Таблица сотрудников имеет большинство необходимых значений (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

Я уверен, что есть лучший способ, потому что много дублирования кода. Подходят ли временные таблицы в этом случае? Я не уверен, как это можно сделать без него. Есть предложения?

Ответы [ 3 ]

3 голосов
/ 04 апреля 2011

Вы, вероятно, можете использовать 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 ...
2 голосов
/ 04 апреля 2011

Вы можете использовать общее табличное выражение для инкапсуляции кода подсчета сотрудников ...

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)
0 голосов
/ 04 апреля 2011

Может быть, я запутался или не вижу что-то, но почему бы просто не использовать агрегаты?

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...