Оптимизировать запрос
От: corpse56  
Дата: 25.03.11 12:56
Оценка:
Здравствуйте!

Возможно ли уменьшить объем кода следующего запроса?


with A as (
select ID,DATE1 
from table  
where DATE1 between '20110325' and '20110325'  
group by DATE1,ID
),
B as (
select ID,DATE2 
from table  
where DATE2 between '20110325' and '20110325'  
group by DATE2,ID
),
C as (
select ID,DATE3 
from table  
where DATE3 between '20110325' and '20110325'  
group by DATE3,ID
)
select * from A
union
select * from B
union
select * from C


вкратце суть такая:
нужно подсчитать количество обслуженных клиентов. обслуживание может быть трех видов и каждое фиксируется датой. но если один и тот же клиент делает в один день два или три вида обслуживания, или три обслуживания одного вида, то считать нужно как одно обслуживание.
ну как-то так...

спасибо!
Re: Оптимизировать запрос
От: cvetkov  
Дата: 25.03.11 13:25
Оценка:
select count(*) from table where
DATE1 between '20110325' and '20110325'
or
where DATE2 between '20110325' and '20110325'  
or
where DATE3 between '20110325' and '20110325'
Re[2]: Оптимизировать запрос
От: corpse56  
Дата: 25.03.11 14:19
Оценка:
Здравствуйте, cvetkov, Вы писали:

C>
C>select count(*) from table where
C>DATE1 between '20110325' and '20110325'
C>or
C>where DATE2 between '20110325' and '20110325'  
C>or
C>where DATE3 between '20110325' and '20110325' 

C>


Ваш вариант запроса не исключает указанное мной условие:
"если один и тот же клиент делает в один день два или три вида обслуживания, или три обслуживания одного вида, то считать нужно как одно обслуживание."
Результат вашего запроса как раз включает все повторения.
Re: Оптимизировать запрос
От: AmKad  
Дата: 25.03.11 22:34
Оценка:
Если база MS SQL 2005+, то
-- Эмуляция тестовых данных
with your_table as(
select 1 client_id, cast('2010-01-15 12:17:23' as datetime) dt1, cast('2010-01-19 10:12:23' as datetime) dt2, cast('2010-01-15 12:02:23' as datetime) dt3 union all 
select 1 client_id, cast('2010-01-15 12:12:23' as datetime) dt1, cast('2010-01-15 12:12:23' as datetime) dt2, cast('2010-01-15 12:12:23' as datetime) dt3 union all 
select 1 client_id, cast('2010-01-10 12:12:23' as datetime) dt1, cast('2010-01-20 12:12:23' as datetime) dt2, cast('2010-01-12 12:12:23' as datetime) dt3 union all 
select 2 client_id, cast('2010-01-15 12:12:23' as datetime) dt1, cast('2010-01-15 12:12:23' as datetime) dt2, cast('2010-01-15 12:12:23' as datetime) dt3 union all 
select 2 client_id, cast('2010-01-10 12:12:23' as datetime) dt1, cast('2010-01-15 12:12:23' as datetime) dt2, cast('2010-01-15 12:12:23' as datetime) dt3 union all 
select 3 client_id, cast('2010-01-12 12:12:23' as datetime) dt1, cast('2010-01-15 12:12:23' as datetime) dt2, cast('2010-01-14 12:12:23' as datetime) dt3 union all 
select 3 client_id, cast('2010-01-14 12:12:23' as datetime) dt1, cast('2010-01-15 12:12:23' as datetime) dt2, cast('2010-01-15 12:12:23' as datetime) dt3 union all 
select 4 client_id, cast('2010-01-15 12:12:23' as datetime) dt1, cast('2010-01-10 12:12:23' as datetime) dt2, cast('2010-01-12 12:12:23' as datetime) dt3
)
-- Сам запрос
select convert(varchar(10), dt, 20) dt, count(distinct client_id) cnt_client
from
  (select * from your_table) s
unpivot (dt for t in (dt1, dt2, dt3)) np
group by convert(varchar(10), dt, 20)
order by 1;
Re: Оптимизировать запрос
От: AmKad  
Дата: 25.03.11 23:10
Оценка: 2 (1)
Если нужно только за конкретный день, то допилить вариант от cvetkov, заменив count(*) на count(distinct client_id).
Re[3]: Оптимизировать запрос
От: cvetkov  
Дата: 28.03.11 09:16
Оценка: 2 (1)
да, я не совсем правильно понял условие.
как тут уже сказали надо diatinct добавить
Re[4]: Оптимизировать запрос
От: corpse56  
Дата: 06.04.11 08:52
Оценка:
Здравствуйте, cvetkov, Вы писали:

C>да, я не совсем правильно понял условие.

C>как тут уже сказали надо diatinct добавить

да. с дистинктом сработало. спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.