Объединение двух таблиц при двукратном объединении одной таблицы с разными фильтрами

Я собрал данные в двух таблицах SQL Server:

ОБЛАСТИ

область а б

СМЕНЫ

Персональный идентификационный номер дата смена область 12 10 января 2012 г. рано а 13 10 января 2012 г. рано а 14 10 января 2012 г. поздно а 15 10 января 2012 г. рано б

Я хочу объединить их вместе в таком запросе:

область дата рано поздно а 10 января 2012 г. 12 14 а 10 января 2012 г. 13 б 10 января 2012 г. 15

Я пробовал что-то вроде:

SELECT
    AREAS.area, early.date, early.personal_id as early, 
    late, personal_id as late
FROM 
    AREAS
LEFT JOIN 
    SHIFTS AS early ON AREAS.area = early.area
LEFT JOIN 
    SHIFTS AS late ON AREAS.area = late.area
WHERE
    early.shifttime = 'early' 
    AND late.shifttime = 'late' 
    AND date = '2012-01-10'

но это выводит:

область дата рано поздно а 10 января 2012 г. 12 14 а 10 января 2012 г. 13 14 б 10 января 2012 г. 15

Есть ли другой способ присоединиться или мне нужно по-другому сохранять данные на SQL Server?

Помещение предложения типа early.shifttime = 'early' в WHERE, когда у вас есть от LEFT JOIN до early, делает это JOININNER JOIN; невозможно, чтобы early.shifttime = 'early' было правдой, если в таблице не найдена ни одна строка.

Thom A 12.07.2024 09:59
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Под одними и теми же personal_id, area и date находится несколько shift, и вы хотели показать их в разных строках. Вы можете использовать row_number(), чтобы сгенерировать порядковый номер для каждого из personal_id.

row_number() over (partition by a.area, s.date, s.shifttime 
                       order by s.personal_id)

Оттуда вы можете использовать запрос PIVOT.

select area, date, early, late
from   (
           select a.area, s.date, s.shifttime, s.personal_id,
                  rn = row_number() over (partition by a.area, s.date, s.shifttime 
                                              order by s.personal_id)
           from   AREAS a
                  left join SHIFTS s on a.area = s.area
       ) d
       pivot
       (
           max (personal_id)
           for shifttime in ([early], [late])
       ) p

или способ выражения условного регистра

select d.area, d.date, 
       early = max(case when shifttime = 'early' then personal_id end), 
       late  = max(case when shifttime = 'late'  then personal_id end)
from   (
           select a.area, s.date, s.shifttime, s.personal_id,
                  rn = row_number() over (partition by a.area, s.date, s.shifttime 
                                              order by s.personal_id)
           from   AREAS a
                  left join SHIFTS s on a.area = s.area
       ) d
group by d.area, d.date, rn

Честно говоря, я не могу понять, что происходит, но это именно то, чего я хочу! Большое спасибо!

Malte Rothkamm 12.07.2024 11:35

Другие вопросы по теме