2013-05-22 2 views
0

Я использую SQL Server 2008 R2 и пытаюсь сделать несколько учетных записей в разных столбцах и не могу понять, как заставить его работать должным образом. У меня есть два запроса, которые работают независимо, но возникают проблемы при попытке их комбинировать. Попытка подсчитать количество билетов, открытых и закрытых в течение каждой отдельной даты, при прохождении через @StartDate и @EndDate.Функция подсчета в нескольких столбцах по дате (SQL Server)

Например, мой первый запрос: (мы назначаем определенные коды для разграничения между разными причинами, которые создаются, просто хотели выбросить это там, если эта строка создает путаницу. Также наши даты являются форматом даты и времени, использование CAST)

SELECT 
Cast(CreateDate AS Date) AS 'Date', 
Count(CreateDate) AS '# Created' 

FROM dbo.Tickets 

WHERE 
Cast(CreateDate AS Date) >= @StartDate and 
Cast(CreateDate AS Date) <[email protected] and 
(Reason >= 36 and Reason <= 41 OR Reason = 17) 

GROUP BY Cast(CreateDate AS Date) 

ORDER BY 'Date' 

Который дает следующие результаты:

Date    # Created 
----------  ------------- 
5/1/2013   396 
5/2/2013   418 
5/3/2013   288 
5/4/2013   28 
5/5/2013   100 

Мой второй запрос является точно такой же, как запрос «Дата создания», просто заменяется на «Решенный Дата», где «CreateDate» расположен. Однако в день 4/4/2013 билетов не было.

Как объединить эти два запроса в один и заставить его возвращать набор результатов, как показано ниже?

Date    # Created   # Resolved 
----------  -------------  ------------- 
5/1/2013   396     400 
5/2/2013   418     322 
5/3/2013   288     280 
5/4/2013   28     0 
5/5/2013   100     11 

Я думаю, что часть, которая меня отбрасывает, заключается в том, что в таблице нет разрешенной даты 5/4/2013. Любая помощь приветствуется. Благодаря!

ответ

0

Попробуйте это:

with all_dates(the_date) 
as 
(
    select min(cast(createdate as date)) 
    from tickets 
    UNION ALL 
    select DATEADD(day,1,the_date) 
    from all_dates 
    where all_dates.the_date < GETDATE()+1 

) 

select the_date, 
     SUM(case when CAST(t.createdate as DATE) = ad.the_date then 1 else 0 end) as CreatedCount, 
     SUM(Case when CAST(t.resolveddate as DATE) = ad.the_date then 1 else 0 end) as ResolvedCount 
from all_dates ad 
left outer join tickets t 
on ad.the_date = CAST(t.createdate as DATE) 
or ad.the_date = CAST(t.resolveddate as DATE) 
group by ad.the_date 
option (MAXRECURSION 10000) 

Я создал КТР провести все даты между 1-м создал дату и сегодня. Таким образом, даже если у вас нет билета, созданного или разрешенного на дату, вы все равно увидите этот день в своих результатах.

+0

Вам нужно указать даты в '' CASE '' так же, как в деле 'ON'. – HABO

+0

Да, да. Благодарю. Сделано редактирование. –

+0

Удивительный! Я получил его отлично! Большое спасибо за помощь! Даже не подумал использовать CTE :) – Grummer21

Смежные вопросы