У меня есть такая таблица в SQL Server
Как я должен иметь следующую форму с предложением присоединения? Не с функциями group by, CTE, COALESCE, Null, условной агрегацией и PIVOT. Предложение case разрешено только в условиях соединения.
select columns
from Table T1
join Table T2 on .......................
join Table T3 on .......................
Кстати, ваш заголовок требует одного, а ваши данные показывают совершенно другое. Вы ни к чему не присоединяетесь
Пожалуйста, избегайте использования изображения. Разместите свои образцы данных в виде текста
спасибо Панайотис Канавос, но некоторые строки будут усечены.
Я бы рекомендовал условную агрегацию:
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: ответ объясняет, что условная агрегация - более простой подход. Почему вы специально хотите использовать объединение?
кроме того, c и d будут усечены. чтобы лучше понять мою фактическую таблицу и сделать просмотр на сервере sql
..для присоединения...
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 .. сюжет сгущается .. какие правила нарушает второй запрос?
выбрать столбцы из таблицы T1 присоединиться к таблице T2 на ...................... присоединиться к таблице T3 на ....... ...................
..@RF1991..слияние()? вы можете использовать case-when-end .. в выборе не будет круглых скобок (!!), но разрешен ли регистр в выборе?
регистр разрешен только в условиях соединения
@ RF1991 .. количество присоединений ограничено? разрешено ли присоединяться к таблице более 2 раз или должно быть только одно/единственное присоединение?
Нет, количество множественных присоединений не ограничено.
[email protected]й вопрос в ответе.. (в чем причина этого садистского требования?) <-- риторический вопрос..
Моя исходная таблица содержит более 100000 строк и 10 столбцов, и я хочу, чтобы этот запрос сделал VIEW на сервере SQL.
Вы пробовали на самом деле делать то, что вы просите? Все базы данных здесь работают одинаково, поэтому
table1 t1 inner join table1 t2 on t1...=t2...
работает везде