Я собрал данные в двух таблицах SQL Server:
ОБЛАСТИ
СМЕНЫ
Я хочу объединить их вместе в таком запросе:
Я пробовал что-то вроде:
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'
но это выводит:
Есть ли другой способ присоединиться или мне нужно по-другому сохранять данные на SQL Server?
Под одними и теми же 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
Честно говоря, я не могу понять, что происходит, но это именно то, чего я хочу! Большое спасибо!
Помещение предложения типа
early.shifttime = 'early'
вWHERE
, когда у вас есть отLEFT JOIN
доearly
, делает этоJOIN
INNER JOIN
; невозможно, чтобыearly.shifttime = 'early'
было правдой, если в таблице не найдена ни одна строка.