计算项目,逐月循环,每次添加月份

时间:2012-12-07 17:11:45

标签: sql vb.net linq

我有一张门票表。我试图计算在当年的每个月结束时有多少票“开放”。同样,我正在将其推向条形图,我需要通过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 |
-----------

2 个答案:

答案 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函数来获取每个月的第一天和最后一天。