Динамическое имя столбца в зависимости от дня от даты - PullRequest
0 голосов
/ 28 февраля 2019

Мне нужно создать таблицу с шаблоном ниже.Мне нужно иметь, например, данные типа Last Name, First Name из двух таблиц, а затем данные хранятся в отдельных записях для каждого человека.Как я могу это сделать?

Таблица, полученная в результате запроса

+-----------------------------------------+
| Last name | First name | 1  | 2 |..| 31 |
+-----------------------------------------+
|  Andrew   |   test     |  8 | 0 |..| 8  |
+-----------------------------------------+
|  John     |   him      |  0 | 0 |..| 0  |
+-----------------------------------------+

Пользователи таблицы

+-------------------------------+
| id |  first_name  | last_name |
+-------------------------------+
| 1  |     test     |   Andrew  |
+-------------------------------+
| 2  |      him     |    John   |
+-------------------------------+

Работа с таблицами

+-------------------------------------------------------+
| id  |  person_id  |  date_created |  number_of_hours  |
+-------------------------------------------------------+
| 1   |      1      |   01.01.2019  |        8          |
+-------------------------------------------------------+
| 2   |      1      |   02.01.2019  |        0          |
+-------------------------------------------------------+
...
+-------------------------------------------------------+
| 31  |      1      |   31.01.2019  |        8          |
+-------------------------------------------------------+
| 32  |      2      |   01.01.2019  |        0          |
+-------------------------------------------------------+
...

Я пробовалчтобы получить также название дня Как Понедельник, .., Воскресенье, и у меня есть это

select n, case TO_CHAR( to_date(n||'.01','dd.mm'),'D')
          when '1' then n||' D'
          when '2' then 'L'
          when '3' then 'Ma'
          when '4' then 'Mi'
          when '5' then 'J'
          when '6' then 'V'
          when '7' then 'S' else 'no data'
       end d from
   (select rownum n from dual connect by level <= 31)
where n >= 1

И я знаю, что не могу так использовать, но как я могу сделать этот запрос для работы?Спасибо

SELECT
    a.last_name
   ,a.first_name
   ,  -- {this is what i can't figure out how to do it}
FROM users a
INNER JOIN work b
on a.id = b.person_id

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Как я понял ваш вопрос, вы хотели бы сгруппировать часы из таблицы работы по дням и пользователям.Это может быть достигнуто с помощью предложения pivot:

    select * FROM (
    SELECT
        a.last_name
       ,a.first_name
       ,w.date_created
       ,w.number_of_hours
    FROM users a
        JOIN work w on a.id = w.person_id
    ) PIVOT (
      sum(number_of_hours)
      FOR date_created
      IN (date '2019-01-01' as "2019-01-01", DATE '2019-01-01' as "2019-01-02")
      )

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

    select * FROM (
    SELECT
        a.last_name
       ,a.first_name
       ,to_char(w.date_created, 'D') as day_of_week
       ,w.number_of_hours
    FROM users a
        JOIN work w on a.id = w.person_id
    ) PIVOT (
      sum(number_of_hours)
      FOR day_of_week
      IN (1,2,3,4,5,6,7)
      )
0 голосов
/ 28 февраля 2019

Если вы хотите сохранить фамилию, имя и данные за дни от 1 до 31, давайте попробуем предложение «pivot» (работает в Oracle).Должно помочь

select * from (-- subquery
  select a.last_name ,a.first_name
  ,b.day_number -- between 1 and 31
  ,b.number_of_hours
  from users a
  inner join work b on a.id = b.person_id
) pivot (-- pibot clouse
  sum(number_of_hours)
  for day_number in (1,2, ..., 31)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...