Sql 计算项目,按月循环,每次通过

Sql 计算项目,按月循环,每次通过,sql,vb.net,linq,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 (

我有一桌票。我正在努力计算今年每个月底有多少张门票被打开。同样,我把它推到一个条形图上,我需要通过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'

如果您的查询返回您需要的内容,则只需使用DATENAMEMONTH、yourDate来检索月份和分组(按月、按年):

 SELECT SUM(*), DATENAME(MONTH,yourDate), DATEPART(YEAR,yourDate)
 FROM
 (
     your actual query here
 )
 GROUP BY DATENAME(MONTH,yourDate), DATEPART(YEAR,yourDate)

您的SQL有几个错误。正在按CreateDate分组,但您没有将其作为子查询中的列。而且,计数*上没有列别名

我想这就是你想要做的:

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

需要更多信息。您将其标记为VB.NET,但没有VB代码。你到底遇到了什么问题?我想把它转换成VB LINQ。我不确定如何计算所有月份和循环计数?在LINQ查询中。我刚刚发现有一个CreateDate和CloseDate,我会在几分钟内调整查询,但你会明白问题的关键,你的问题没有考虑CloseDate,因为你指定了计算每个月打开的票证数量。。。我正在计算月底有多少张票是开着的。对不起,没有打开,但仍然打开。查克:请考虑编辑您的问题,澄清混乱的一点。我已经更新了我的问题,希望它是更好的。我的SQL语句返回当前需要的计数,但我需要循环每个月并返回一组年度数据抱歉,此查询没有考虑我需要的约束。我需要知道在每个月底有多少票是开放的。我的逻辑是这样的:清点月初到月底之间所有的门票。从月底之前结清的票数中减去这个数字。对不起,我试图在我原来的帖子中澄清更多。希望它更有意义。对不起,这太令人困惑了。我现在就试试你的建议。@Chuck。不要道歉。写一个明确的问题可能比写一个明确的答案更难。我应该把这个问题读得更清楚一些。虽然有可能记录不是每天都被创建的,这就是为什么我在最初的查询中得到了第一天和最后一天,或者试图得到第一天和最后一天。查询时出现错误QQ,但我认为问题所在的组是您添加的组,用于修复最小值和最大值的问题。我修复了组,并在SQL FIDLE上对其进行了测试。
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