1

我正在使用 SQL Server 2008 R2 并尝试对不同的列进行多次计数,但不知道如何让它正常工作。我有两个独立工作的查询,但在尝试组合它们时遇到了麻烦。在通过@StartDate 和@EndDate 时,尝试计算每个单独日期打开和关闭的票证数量。

例如,这是我的第一个查询:(我们分配了某些代码来区分创建票证的不同原因,只是想把它扔在那里以防该行造成任何混乱。而且我们的日期是日期时间格式,因此使用 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) <=@EndDate 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

我的第二个查询与“创建日期”查询完全相同,只是在“创建日期”所在的位置替换为“已解决日期”。但是,在 2013 年 5 月 4 日没有解决任何问题。

如何将这两个查询合二为一,并让它返回如下所示的结果集?

 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 的解决日期。任何帮助将非常感激。谢谢!

4

1 回答 1

1

尝试这个:

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)

我创建了一个 CTE 来保存第一次创建日期和今天之间的所有日期。这样,即使您没有在某个日期创建或解决故障单,您仍会在结果中看到该日期。

于 2013-05-22T13:50:27.420 回答