Как вставить нуль в перекрестное соединение? - PullRequest
0 голосов
/ 28 января 2019

У меня проблема здесь.У меня есть 2 таблицы, которые связаны столбцом «id.x». В одной таблице указаны недели данного месяца, например, для января таблица имеет 5 строк, по одной на каждую неделю месяца.В другой таблице представлены усилия сотрудника за данную неделю.

Я хочу объединить две таблицы, но хочу, чтобы в нем отображались усилия сотрудника за данную неделю, поэтому вв этом случае по 5 реестров на каждого сотрудника, даже если он не регистрировал усилия в течение недели, в этом случае мы устанавливаем усилия как нулевые.

Я дам вам представление о том, что я ищу, и если это возможно.

Table 1:
id week month year id.x
1   1    1    2019 7819
2   2    1    2019 7819
3   3    1    2019 7819
4   4    1    2019 7819
5   5    1    2019 7819

Table 2:
employee_id effort id.x week  
   63         100  7819  3

Результат, который я хочу:

employee week effort id.x
   63     1    null  7819
   63     2    null  7819
   63     3    100   7819
   63     4    null  7819
   63     5    null  7819

Возможно ли этодостичь этого результата?

В настоящее время я пытаюсь выполнить этот запрос:

select t2.employee, t1.week from 
table_2 t2
cross join
table_1 tt
order by t2.employee, t1.week;

Редактировать:

А если я хочу суммировать значения данной недели?Например:

Таблица 2 теперь имеет:

employee_id effort id.x week  
       63    60    7819   3
       63    40    7819   3

Но я хочу тот же ответ:

Результат, который я хочу:

  employee week effort id.x
       63     1    null  7819
       63     2    null  7819
       63     3    100   7819
       63     4    null  7819
       63     5    null  7819 

Ответы [ 2 ]

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

Используйте PARTITION OUTER JOIN:

Установка Oracle :

CREATE TABLE Table1 ( id, week, month, year, id_x ) AS
SELECT 1, 1, 1, 2019, 7819 FROM DUAL UNION ALL
SELECT 2, 2, 1, 2019, 7819 FROM DUAL UNION ALL
SELECT 3, 3, 1, 2019, 7819 FROM DUAL UNION ALL
SELECT 4, 4, 1, 2019, 7819 FROM DUAL UNION ALL
SELECT 5, 5, 1, 2019, 7819 FROM DUAL;

CREATE TABLE Table2 ( employee_id, effort, id_x, week ) AS
SELECT 63, 100, 7819, 3 FROM DUAL;

Запрос :

SELECT t2.employee_id,
       t1.week,
       t2.effort,
       t1.id_x
FROM   Table2 t2
       PARTITION BY ( employee_id )
       RIGHT OUTER JOIN table1 t1
       ON (
             t1.week = t2.week
         AND t1.id_x = t2.id_x
       )

Выход :

EMPLOYEE_ID | WEEK | EFFORT | ID_X
----------: | ---: | -----: | ---:
         63 |    1 |   <em>null</em> | 7819
         63 |    2 |   <em>null</em> | 7819
         63 |    3 |    100 | 7819
         63 |    4 |   <em>null</em> | 7819
         63 |    5 |   <em>null</em> | 7819

дБ <> скрипка здесь

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

Требуется строка результатов на сотрудника и неделю.Это перекрестное соединение, о котором вы уже упоминали.Только тогда внешнее объединение ваших реальных данных сотрудника.Что-то вроде:

select *
from employees
cross join weeks
left join employee_efforts using (employee_id, id_x, week);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...