изменить строки на столбцы и считать - PullRequest
1 голос
/ 08 ноября 2010

как рассчитать количество на основе строк?

ТАБЛИЦА ИСТОЧНИКОВ Каждый сотрудник может взять 2 выходных дня

Employee-----First_Day_Off-----Second_Day_Off
1------------10/21/2009--------12/6/2009
2------------09/3/2009--------12/6/2009
3------------09/3/2009--------NULL
4
5
.
.
.

Теперь мне нужна таблица, которая показывает даты и количество людей, взлетающих в этот день

Date---------First_Day_Off-------Second_Day_Off
10/21/2009---1-------------------0
12/06/2009---1--------------------1
09/3/2009----2--------------------0

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 08 ноября 2010

Oracle 9i + с использованием факторинга подзапроса (WITH):

WITH sample AS (
   SELECT a.employee,
          a.first_day_off AS day_off,
          1 AS day_number
     FROM YOUR_TABLE a
    WHERE a.first_day_off IS NOT NULL
   UNION ALL
   SELECT b.employee,
          b.second_day_off,
          2 AS day_number
     FROM YOUR_TABLE b
    WHERE b.second_day_off IS NOT NULL)
  SELECT s.day_off AS date,
         SUM(CASE WHEN s.day_number = 1 THEN 1 ELSE 0 END) AS first_day_off,
         SUM(CASE WHEN s.day_number = 2 THEN 1 ELSE 0 END) AS second_day_off
    FROM sample s
GROUP BY s.day_off

Версия без подзапроса

  SELECT s.day_off AS date,
         SUM(CASE WHEN s.day_number = 1 THEN 1 ELSE 0 END) AS first_day_off,
         SUM(CASE WHEN s.day_number = 2 THEN 1 ELSE 0 END) AS second_day_off
    FROM (SELECT a.employee,
                 a.first_day_off AS day_off,
                 1 AS day_number
            FROM YOUR_TABLE a
           WHERE a.first_day_off IS NOT NULL
          UNION ALL
          SELECT b.employee,
                 b.second_day_off,
                 2 AS day_number
            FROM YOUR_TABLE b
           WHERE b.second_day_off IS NOT NULL) s
GROUP BY s.day_off
1 голос
/ 08 ноября 2010

Работать с этими запросами немного неудобно, поскольку у вас есть выходные дни, которые хранятся в разных столбцах.Лучшим вариантом было бы иметь что-то вроде

EMPLOYEE_ID    DAY_OFF

Тогда у вас было бы несколько рядов, если бы сотрудник взял несколько выходных

EMPLOYEE_ID    DAY_OFF
1              10/21/2009
1              12/6/2009
2              09/3/2009
2              12/6/2009
3              09/3/2009
...

В этом случае вы могли бы узнать, скольковыходные дни каждый человек взял, используя следующий запрос:

SELECT EMPLOYEE_ID, COUNT(*) AS NUM_DAYS_OFF FROM DAYS_OFF_TABLE GROUP BY EMPLOYEE_ID

И количество людей, которые взяли выходные дни на каждую дату, например:

SELECT DAY_OFF, COUNT(*) AS NUM_PEOPLE FROM DAYS_OFF_TABLE GROUP BY DAY_OFF

Но я отвлекся ...

Вы можете попытаться использовать оператор SQL CASE , чтобы помочь с этим:

SELECT Employee, CASE
    WHEN First_Day_Off is NULL AND Second_Day_Off is NULL THEN 0
    WHEN First_Day_Off is NOT NULL AND Second_Day_Off is NULL THEN 1
    WHEN First_Day_Off is NULL AND Second_Day_Off is NOT NULL THEN 1
    ELSE 2
    END AS NUM_DAYS_OFF
FROM DAYS_OFF_TABLE

(обратите внимание, что вам может потребоваться немного изменить синтаксис в зависимости от вашегобаза данных.

Получение даты и количества людей, которые взлетели в этот день, может быть более сложным.

Я не знаю, сработает ли это, но вы можете попробовать это:

SELECT
    Date_Off,
    COUNT(*) AS Num_People
FROM
    (SELECT
        First_Day_Off, COUNT(*) AS Num_People FROM DAYS_OFF_TABLE WHERE First_Day_Off IS NOT NULL GROUP BY First_Day_Off
    UNION
    SELECT Second_Day_Off, COUNT(*) AS Num_People FROM DAYS_OFF_TABLE WHERE Second_Day_Off IS NOT NULL GROUP BY Second_Day_Off)
GROUP BY
    Num_People
...