BOOPATHI A Ответов: 1

Я хочу объединить две таблицы в sql.


i want to join two tables in sql.first table name is Shift. Second Table name is Leave. An employee may full present or half day absent or leave, or full day leave. If full day leave no data on shift table. If he give leave letter then record added on leave table. i want to join these two tables.


мои столы выглядят так
Сдвиг
Empnum punchdate  shift 
Test1  01/09/2020   1
Test1  03/09/2020   0.5

Покидать
Empnum LeaveDate  leaveFN  LeaveAF
Test1  02/09/2020  0.5       0.5
Test1  03/09/2020  0         0.5


я хочу присоединиться вот так
Test1 01/09/2020 1    0    0
Test1 02/09/2020 0    0.5  0.5
Test1 03/09/2020 0.5  0    0.5


Что я уже пробовал:

я попробовал левое соединение, полное внешнее соединение, крест и т. д
это шоу,
Test1 01/09/2020 1 0.5  0.5
Test1 02/09/2020 1 0.5  0.5
Test1 01/09/2020 1 0    0.5
Test1 02/09/2020 1 0    0.5

1 Ответов

Рейтинг:
2

Maciej Los

Вы не показали нам, какой запрос вы использовали. Тем не менее...

Чтобы получить желаемый результат, вы должны получить все отчетливые даты и EmpNum- это с обоих столов. Видеть:

SET DATEFORMAT dmy;

CREATE TABLE Shift
(
  Empnum varchar(50),
  punchdate date,
  shift decimal(5,1)
);

CREATE TABLE Leave
(
  Empnum varchar(50),
  LeaveDate date,
  leaveFN decimal(5,1),
  LeaveAF decimal(5,1)
);

INSERT INTO Shift (Empnum, punchdate, shift)
VALUES('Test1', '01/09/2020', 1),
('Test1', '03/09/2020', 0.5),
('Test2', '01/09/2020', 1),
('Test2', '02/09/2020', 1)

INSERT INTO Leave(Empnum, LeaveDate, leaveFN, LeaveAF)
VALUES('Test1' , '02/09/2020', 0.5, 0.5),
('Test1', '03/09/2020', 0, 0.5)

;WITH CTE AS
(
    SELECT punchdate AS CurrentDate
    FROM Shift
    UNION ALL
    SELECT LeaveDate As CurrentDate
    FROM Leave
), Emps AS
(
    SELECT EmpNum 
    FROM Shift
    UNION ALL
    SELECT EmpNum
    FROM Leave
)
SELECT c.Empnum, c.CurrentDate, 
  COALESCE(s.shift, 0) shift,
  COALESCE(l.leaveFN, 0) leaveFN,  
  COALESCE(l.leaveAF, 0) leaveAF 
FROM
(
  SELECT DISTINCT cc.CurrentDate, ee.EmpNum
  FROM CTE cc CROSS JOIN Emps ee
) c LEFT JOIN Shift s ON c.CurrentDate = s.punchdate AND c.EmpNum = s.EmpNum
  LEFT JOIN Leave l ON c.CurrentDate = l.LeaveDate AND c.EmpNum = l.EmpNum


Результат:
Empnum 	CurrentDate 	shift 	leaveFN 	leaveAF
Test1 	2020-09-01 	1.0 	0.0 	0.0
Test2 	2020-09-01 	1.0 	0.0 	0.0
Test1 	2020-09-02 	0.0 	0.5 	0.5
Test2 	2020-09-02 	1.0 	0.0 	0.0
Test1 	2020-09-03 	0.5 	0.0 	0.5
Test2 	2020-09-03 	0.0 	0.0 	0.0 <- missing record for Test2, which means no corresponding data in Shift and Leave table for 03/09/2020


db<>скрипка[^]

Удачи вам!


BOOPATHI A

если я добавлю empnum Test2 в таблицу сдвигов, а не в таблицу отпусков, то теперь Test1 также покинет соединение с Test2. как не обращать на это внимания.

Maciej Los

В этом случае необходима небольшая модификация ;) См. обновленный ответ.

BOOPATHI A

Отличный. Работает нормально. Спасибо тебе, Мацей Лос.

Maciej Los

Всегда пожалуйста. Чтобы закрыть эту тему, используйте зеленую кнопку, которая пометит этот ответ как решение.