#sql #sql-server #pivot #left-join #aggregate-functions
#sql #sql-server #сводная #левое соединение #агрегатные функции
Вопрос:
У меня есть две таблицы:
Таблица A:
ID
1
2
3
4
5
Таблица B:
ID UDFNumber UDFValue
1 5 ID1sUDF5Value
1 6 ID1sUDF6Value
1 7 ID1sUDF7Value
1 8 ID1sUDF8Value
1 9 ID1sUDF9Value
2 5 ID2sUDF5Value
2 6 ID2sUDF6Value
2 7 ID2sUDF7Value
2 8 ID2sUDF8Value
2 9 ID2sUDF9Value
etc
Я пытаюсь вывести значения только UDF5 и UDF9 в виде столбцов для каждой строки в таблице A.
Вывод, который я ищу:
ID UDF5 UDF9
1 ID1sUDF5Value ID1sUDF9Value
2 ID2sUDF5Value ID2sUDF9Value
3 ID3sUDF5Value ID3sUDF9Value
и т.д.
Какой оператор join / sql приведет к такому результату? MS SQL Server.
Ответ №1:
Вы можете использовать условную агрегацию:
select id,
max(case when udfnumber = 5 then udfvalue end) as udf5,
max(case when udfnumber = 9 then udfvalue end) as udf9
from tableb
where udfnumber in (5, 9)
group by id
Обратите внимание, что вам не нужно tablea
генерировать нужный результат, если вы не хотите разрешать строки без совпадений tableb
. Если это так:
select a.id,
max(case when b.udfnumber = 5 then b.udfvalue end) as udf5,
max(case when b.udfnumber = 9 then b.udfvalue end) as udf9
from tablea a
left join tableb b on b.id = a.id and b.udfnumber in (5, 9)
group by a.id
Наконец: только для двух значений объединение дважды является жизнеспособной альтернативой:
select a.id, b5.udfvalue as udf5, b9.udfvalue as udf9
from tablea a
left join tableb b5 on b5.id = a.id and b5.udfnumber = 5
left join tableb b9 on b9.id = a.id and b8.udfnumber = 9
Комментарии:
1. Это именно то, что я искал. Я буду использовать дополнительный пример с объединением, поскольку это часть более масштабного решения, для которого требуется объединение. Я просто не мог понять, как получить две строки из таблицы B в качестве соединяемой строки в таблицу A со значениями в виде столбцов. Спасибо.