Инструкция SQL для получения отдельных значений из нескольких строк из правой таблицы в виде столбцов на выходе

#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 со значениями в виде столбцов. Спасибо.