Сводные данные с использованием множественного соединения

У меня есть такая таблица в SQL Server

имя темы средний а 1 12 а 2 13,5 б 1 19 б 2 15,5 с 2 5 г 1 16,75

Как я должен иметь следующую форму с предложением присоединения? Не с функциями group by, CTE, COALESCE, Null, условной агрегацией и PIVOT. Предложение case разрешено только в условиях соединения.

select columns
from Table T1
join Table T2 on .......................
join Table T3 on .......................
имя aver1 aver2 а 12 13,5 б 19 15,5 б Нулевой 5 г 16,75 Нулевой

Вы пробовали на самом деле делать то, что вы просите? Все базы данных здесь работают одинаково, поэтому table1 t1 inner join table1 t2 on t1...=t2... работает везде

Panagiotis Kanavos 10.12.2020 10:39

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

Panagiotis Kanavos 10.12.2020 10:40

Пожалуйста, избегайте использования изображения. Разместите свои образцы данных в виде текста

Squirrel 10.12.2020 10:46

спасибо Панайотис Канавос, но некоторые строки будут усечены.

RF1991 10.12.2020 11:56
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
4
489
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я бы рекомендовал условную агрегацию:

select name,
    max(case when tems = 1 then aver end) as aver1,
    max(case when tems = 2 then aver end) as aver2
from mytable
group by name

Если вы настаиваете на присоединении, то:

select t1.name, t1.aver as aver1, t2.aver as aver2
from mytable t1
inner join mytable t2 on t2.name = t1.name
and t1.tems = 1 and t2.tems = 2

Одно предостережение в отношении описанного выше метода соединения заключается в том, что он исключает name, у которых нет обоих tems, поэтому он не даст желаемого результата для ваших выборочных данных. Вы можете обойти это с помощью full join, но это повлечет за собой дополнительную сложность. Условная агрегация проще.

спасибо за ваше предложение, у меня есть работа с этим запросом, но я хочу создать нужную таблицу с соединением

RF1991 10.12.2020 11:10

@ RF1991: ответ объясняет, что условная агрегация - более простой подход. Почему вы специально хотите использовать объединение?

GMB 10.12.2020 11:13

кроме того, c и d будут усечены. чтобы лучше понять мою фактическую таблицу и сделать просмотр на сервере sql

RF1991 10.12.2020 11:13

..для присоединения...

declare @t table(name varchar(10), tems smallint, aver decimal(9,2));

insert into @t(name, tems, aver)
values
('a', 1, 12),
('a', 2, 13.5),
('b', 1, 19),
('b', 2, 15.5),
('c', 2, 5),
('d', 1, 16.75);

select coalesce(t1.name, t2.name) as name, t1.aver as aver1, t2.aver as aver2
from 
(
select *
from @t
where tems = 1
) as t1
full outer join 
(
select *
from @t
where tems = 2
) as t2 on t1.name = t2.name;


select coalesce(t1.name, t2.name) as name, t1.aver as aver1, t2.aver as aver2
from @t as t1
full outer join @t as t2 on t1.name = t2.name and t1.tems = 1 and t2.tems = 2
where t1.tems = 1
or
(t1.tems is null and t2.tems=2);


select t3.name, t1.aver as aver1, t2.aver as aver2
from @t as t1
full outer join @t as t2 on t1.name = t2.name and t1.tems = 1 and t2.tems = 2
join @t as t3 on case when t1.name is null then t2.name else t1.name end = t3.name
and case when t1.name is null then 2 else 1 end = t3.tems
where t1.tems = 1
or
t1.tems is null and t2.tems=2;

спасибо за повтор. Мне нужен только ответ с присоединением. не с регистром, скобками, макс, группировкой и условной агрегацией. однако можно использовать регистр в объединении

RF1991 10.12.2020 12:06

@ RF1991 .. сюжет сгущается .. какие правила нарушает второй запрос?

lptr 10.12.2020 12:28

выбрать столбцы из таблицы T1 присоединиться к таблице T2 на ...................... присоединиться к таблице T3 на ....... ...................

RF1991 10.12.2020 12:43

..@RF1991..слияние()? вы можете использовать case-when-end .. в выборе не будет круглых скобок (!!), но разрешен ли регистр в выборе?

lptr 10.12.2020 12:46

регистр разрешен только в условиях соединения

RF1991 10.12.2020 12:47

@ RF1991 .. количество присоединений ограничено? разрешено ли присоединяться к таблице более 2 раз или должно быть только одно/единственное присоединение?

lptr 10.12.2020 13:07

Нет, количество множественных присоединений не ограничено.

RF1991 10.12.2020 13:26

[email protected]й вопрос в ответе.. (в чем причина этого садистского требования?) <-- риторический вопрос..

lptr 10.12.2020 13:33

Моя исходная таблица содержит более 100000 строк и 10 столбцов, и я хочу, чтобы этот запрос сделал VIEW на сервере SQL.

RF1991 10.12.2020 13:37

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