Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Другие варианты этого запроса  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Есть достаточно навороченный запрос с несколькими подзапросами.
В одном из подзапросов нужно выбрать только те записи, которые в ходят в диапазоны, определенные в другой таблице, и сложить количество. В упрощенном виде это так.
create table T1
   (Num int,
    qt int)

create table T2
   (id int, 
    Nummin int,
    NumMax int)
GO

insert into t1 Values(1, 1), (1, 5), (2, 1), (3 , 1), (4, 1), (5, 1), (10, 1), (23, 1), (21, 1), (25, 1), (25, 2), (30, 1)
insert into t2 Values(1, 1, 1), (2, 2, 2), (3, 10, 27), (4, 1, 3)

select * from T1
select * from T2

select Num, SUM(QT) from
 (select Distinct Num, Qt from t1 inner join t2 on t1.Num >= T2.Nummin	and t1.Num <= T2.Nummax) as TT
group by Num 
   
drop table T1
drop table T2

Но тут, как видим появляется еще один подзапрос, что в на реальной базе еще больше усложняет ситуацию, в первую очередь для чтения самого запроса.
Можно ли это как-то проще записать на Server2008R2? Наверняка про какую-то возможность не знаю :)
Заранее спасибо
26 май 17, 12:49    [20514442]     Ответить | Цитировать Сообщить модератору
 Re: Другие варианты этого запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
minva
Можно ли это как-то проще записать на Server2008R2? Наверняка про какую-то возможность не знаю :)
Ага. Называется "представления".
26 май 17, 13:11    [20514534]     Ответить | Цитировать Сообщить модератору
 Re: Другие варианты этого запроса  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
invm, тут ситуация такая, что это разовый эксклюзивный отчетик для конкретного клиента, поэтому городить представления или другие объекты в общей базе не хочу
26 май 17, 13:19    [20514580]     Ответить | Цитировать Сообщить модератору
 Re: Другие варианты этого запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
minva,

select t1.Num, sum(distinct t1.Qt) from t1 inner join t2 on t1.Num >= T2.Nummin and t1.Num <= T2.Nummax group by t1.Num
26 май 17, 13:31    [20514638]     Ответить | Цитировать Сообщить модератору
 Re: Другие варианты этого запроса  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
invm, Я извиняюсь, вот тут я маху дал. Было бы правильней так пример написать
create table T1
   (ID int,
    Num int,
    qt int)

create table T2
   (id int, 
    Nummin int,
    NumMax int)
GO

insert into t1 Values(1, 1, 1), (2, 1, 5),  (21, 1, 5), (3, 2, 1), (4, 3 , 1), (5, 4, 1), (6, 5, 1), (7, 10, 1), (8, 23, 1), (9, 21, 1), (10, 25, 1), (11, 25, 2), (12, 30, 1)
insert into t2 Values(1, 1, 1), (2, 2, 2), (3, 10, 27), (4, 1, 3)

select * from T1
select * from T2

select Num, SUM(QT) from
 (select Distinct ID, Num, Qt from t1 inner join t2 on t1.Num >= T2.Nummin	and t1.Num <= T2.Nummax) as TT
group by Num 
   
drop table T1
drop table T2
26 май 17, 14:10    [20514833]     Ответить | Цитировать Сообщить модератору
 Re: Другие варианты этого запроса  [new]
aleks2
Guest
1. Сначала убери ЭТО
select Distinct ID, Num, Qt from t1 inner join t2 on t1.Num >= T2.Nummin	and t1.Num <= T2.Nummax

Надо быть мудаком, чтобы сначала размножить строки, а потом заставлять сервер убирать дубли.

2. Ну, t1.Num понятно что из t1. А хрустальные шары шоб сообразить откель ID, Qt - есть не у всех.
26 май 17, 14:30    [20514948]     Ответить | Цитировать Сообщить модератору
 Re: Другие варианты этого запроса  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
aleks2

2. Ну, t1.Num понятно что из t1. А хрустальные шары шоб сообразить откель ID, Qt - есть не у всех.


Вы правы

select Num, SUM(QT) from
 (select Distinct T1.ID, T1.Num, T1.Qt from t1 inner join t2 on t1.Num >= T2.Nummin	and t1.Num <= T2.Nummax) as TT
group by Num


Собственно вот меня и интресует, как убрать дубли, чтоб не писать Distinct
26 май 17, 14:40    [20515020]     Ответить | Цитировать Сообщить модератору
 Re: Другие варианты этого запроса  [new]
aleks2
Guest
minva
aleks2
2. Ну, t1.Num понятно что из t1. А хрустальные шары шоб сообразить откель ID, Qt - есть не у всех.


Вы правы

select Num, SUM(QT) from
 (select Distinct T1.ID, T1.Num, T1.Qt from t1 inner join t2 on t1.Num >= T2.Nummin	and t1.Num <= T2.Nummax) as TT
group by Num


Собственно вот меня и интресует, как убрать дубли, чтоб не писать Distinct


Не писать их в таблицу. Не?
26 май 17, 14:43    [20515041]     Ответить | Цитировать Сообщить модератору
 Re: Другие варианты этого запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
minva
Собственно вот меня и интресует, как убрать дубли, чтоб не писать Distinct
Один вариант я вам уже написал.
Еще можно так:
select t1.Num, sum(t1.Qt) from t1 where exists(select 1 from t2 where t1.Num >= T2.Nummin and t1.Num <= T2.Nummax) group by t1.Num
26 май 17, 14:47    [20515068]     Ответить | Цитировать Сообщить модератору
 Re: Другие варианты этого запроса  [new]
aleks2
Guest
invm
minva
Собственно вот меня и интресует, как убрать дубли, чтоб не писать Distinct
Один вариант я вам уже написал.
Еще можно так:
select t1.Num, sum(t1.Qt) from t1 where exists(select 1 from t2 where t1.Num >= T2.Nummin and t1.Num <= T2.Nummax) group by t1.Num

Ты чо, издеваешься что-ли?

Если уж дубли в таблице неискоренимы - пишем материализованное View.
26 май 17, 14:49    [20515077]     Ответить | Цитировать Сообщить модератору
 Re: Другие варианты этого запроса  [new]
aleks2
Guest
create view UniqueT1 
with schemabinding
as
select ID, Num, Qt, count_big(*) as cnt from t1 group by ID, Num, Qt;
go
create unique clustered index on UniqueT1 (ID, Num, Qt);
go
select * from UniqueT1  with(noexpand);
26 май 17, 14:55    [20515109]     Ответить | Цитировать Сообщить модератору
 Re: Другие варианты этого запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
aleks2
Ты чо, издеваешься что-ли?
Если прекратишь надувать щеки и подумаешь, то поймешь откуда могут возникать дубли.
26 май 17, 16:49    [20515609]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить