我有一张门票表。我试图计算在当年的每个月结束时有多少票“开放”。同样,我正在将其推向条形图,我需要通过LINQ将其放入数组中。
我的SQL查询来计算:
SELECT
(SELECT COUNT(*) FROM tblMaintenanceTicket t WHERE (CreateDate < DATEADD(MM, 1, '01/01/2012')))
-
(SELECT COUNT(*) FROM tblMaintenanceTicket t WHERE (CloseDate < DATEADD(MM, 1, '01/01/2012'))) AS 'Open @Month End'
我的逻辑如下:计算在月初和月末之间打开的所有门票。从月末之前关闭的门票中减去该数量。
更新: 我已经使用下面的注释更新了我的查询,并且它没有处理GROUP中的错误,但我并不是真正理解我猜测的逻辑,我缺乏SQL的技能。
我添加了一个SQL Fiddle示例来向您显示我的查询:http://sqlfiddle.com/#!3/c9b638/1
期望的输出:
-----------
| Jan | 3 |
-----------
| Feb | 4 |
-----------
| Mar | 0 |
-----------
答案 0 :(得分:1)
如果您的查询返回了您需要的内容,则只需使用DATENAME(MONTH, yourDate)
按月检索月份和分组,年份:
SELECT SUM(*), DATENAME(MONTH,yourDate), DATEPART(YEAR,yourDate)
FROM
(
your actual query here
)
GROUP BY DATENAME(MONTH,yourDate), DATEPART(YEAR,yourDate)
答案 1 :(得分:1)
你的SQL有几个错误。 。 。是按CreateDate
进行分组,但您没有将其作为子查询中的列。并且,您在count(*)
我认为这就是你要做的事情:
select DATENAME(MONTH,CreateDate), DATEPART(YEAR,CreateDate),
(sum(case when CreateDate < DATEADD(MM, 1, '01/01/2012') then 1 else 0 end) -
sum(case when CloseDate < DATEADD(MM, 1, '01/01/2012') then 1 else 0 end)
)
from tblMaintenanceTicket
group by DATENAME(MONTH,CreateDate), DATEPART(YEAR,CreateDate)
你的评论似乎阐明了你想要的东西比你的问题更清楚(问题中的解释有点埋没)。您需要的是几个月的驱动程序表,然后将其加入到您的表中。类似的东西:
select mons.yr, mons.mon, count(*) as OpenTickets
from (select month(CreateDate) as mon, year(CreateDate) as yr,
cast(min(CreateDate) as date) as MonthStart,
cast(max(CreateDate) as date) as monthEnd
from tblMaintenanceTicket
group by month(CreateDate), year(CreateDate)
) mons left outer join
tblMaintenanceTicket mt
on mt.CreateDate <= mons.MonthEnd and
(mt.CloseDate > mons.MonthEnd or mt.CloseDate is null)
group by mons.yr, mons.mon
我假设每天都会创建记录。这是一个方便,所以我不必考虑使用其他SQL函数来获取每个月的第一天和最后一天。