Здравствуйте!
Возможно ли уменьшить объем кода следующего запроса?
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
вкратце суть такая:
нужно подсчитать количество обслуженных клиентов. обслуживание может быть трех видов и каждое фиксируется датой. но если один и тот же клиент делает в один день два или три вида обслуживания, или три обслуживания одного вида, то считать нужно как одно обслуживание.
ну как-то так...
спасибо!
select count(*) from table where
DATE1 between '20110325' and '20110325'
or
where DATE2 between '20110325' and '20110325'
or
where DATE3 between '20110325' and '20110325'
Здравствуйте, 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>
Ваш вариант запроса не исключает указанное мной условие:
"если один и тот же клиент делает в один день два или три вида обслуживания, или три обслуживания одного вида, то считать нужно как одно обслуживание."
Результат вашего запроса как раз включает все повторения.
Если база 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;
Если нужно только за конкретный день, то допилить вариант от cvetkov, заменив count(*) на count(distinct client_id).
да, я не совсем правильно понял условие.
как тут уже сказали надо diatinct добавить