2014-03-05 69 views
3

我正在编译我们数据库中工作票据的历史数据。我在过去12个月中使用了本月的最后一天。在那个日期,我想知道有多少票是开放的(在创建日期之前或等于月份的最后一天,日期是在最后一天之后关闭或为空)。截至该月的最后一天,有多少张门票已经营业30天以上,并且该月份有多少张门票已关闭。减少广泛查询

我的查询返回了过去12个月中每个月的4个值。我开发了一个查询,我一次收集了一个月的数据,然后使用Union获取下一个月等等。

我现在正在尝试开发一个不需要每个月收集数据的联盟的查询。这是一个示例月份。

Select Convert(Varchar, 
       DATEADD(day, 
         -1, 
         DATEADD(mm, DATEDIFF(m, 0, GETDATE()) - 12, 0)), 
       101) as [ DateRun ], 
     t1. [ data1 ], 
     sum(t2. [ data2 ] + t3. [ data3 ]) as [ Total Open ], 
     (t1. [ data1 ] + 0.0)/
     sum((t2. [ data2 ] + 0.0) + (t3. [ data3 ] + 0.0)) as [ Percent Aged Over 30 Days ] 
    From (Select count(*) as [ data1 ] 
      From (Select s.ticketnumber, s.datecreated, s.dateclosed 
        from mydb2 i 
       inner join mydb1 s 
        on i.ticketNumber = s.ticketNumber 
       Where datediff(dd, 
           s.dateCreated, 
           DATEADD(day, 
             -1, 
             DATEADD(mm, 
               DATEDIFF(m, 0, GETDATE()) - 12, 
               0))) > '30' 
        AND (s.dateclosed is null OR 
         s.dateclosed >= 
         DATEADD(day, 
           -1, 
           DATEADD(mm, DATEDIFF(m, 0, GETDATE()) - 12, 0))) 
       Group by s.ticketNumber, s.datecreated, s.dateclosed) as tb1) as t1, 
     (Select count(*) as [ data2 ] 
      From (Select s.ticketnumber, s.datecreated, s.dateclosed 
        from mydb2 i 
       inner join mydb1 s 
        on i.ticketNumber = s.ticketNumber 
       Where s.datecreated < 
         DATEADD(day, 
           -1, 
           DATEADD(mm, DATEDIFF(m, 0, GETDATE()) - 12, 0)) 
        AND (s.dateclosed is null OR 
         s.dateclosed >= 
         DATEADD(day, 
           -1, 
           DATEADD(mm, DATEDIFF(m, 0, GETDATE()) - 12, 0))) 
       Group by s.ticketNumber, s.datecreated, s.dateclosed) as tb2) as t2, 
     (Select count(*) as [ data3 ] 
      From (Select s.ticketnumber, s.datecreated, s.dateclosed 
        from mydb2 i 
       inner join mydb1 s 
        on i.ticketNumber = s.ticketNumber 
       Where s.dateclosed > 
         DATEADD(day, 
           -1, 
           DATEADD(mm, DATEDIFF(m, 0, GETDATE()) - 13, 1)) 
        AND s.dateclosed < 
         DATEADD(day, 
           -1, 
           DATEADD(mm, DATEDIFF(m, 0, GETDATE()) - 12, 0)) 
       Group by s.ticketNumber, s.datecreated, s.dateclosed) as tb3) as t3 
Group by t1. [ data1 ] 

通过研究,我能够最后一天拿到了过去12个月以下的代码,但我一直没能更新上面的代码,这样我不需要12个工会。

Select dateadd(month, 1 + datediff(month, 0, s.datecreated), -1) as [ Date Run ] 
    from mydb1 s 
Where s.datecreated > 
     DATEADD(day, -1, DATEADD(mm, DATEDIFF(m, 0, GETDATE()) - 12, 0)) 
    and s.datecreated < 
     DATEADD(day, -1, DATEADD(mm, DATEDIFF(m, 0, GETDATE()), 0)) 
Group by dateadd(month, 1 + datediff(month, 0, s.datecreated), -1) 
Order by 1 
+0

缩进结构让我生病。 –

+0

我对缩进表示歉意(也让我疯狂)。该查询是MS Excel外部Microsoft Query的一部分。它没有复制和粘贴很好。 –

回答

1

您可以尝试使用CTE生成月份,将其作为查询的基础,然后将聚合作为子查询运行。换句话说,这样的事情:

with Months(ClosingDate, n) as 
(
    select DATEADD(dd, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)) as ClosingDate, 1 as n 
    union all 
    select DATEADD(dd, -1, DATEADD(mm, -1, DATEADD(dd, 1, ClosingDate))), n + 1 
    from Months 
    where n < 12 
) 
select DATENAME(mm, m.ClosingDate) MonthLabel, DATEADD(dd, 1 - DATEPART(dd, m.ClosingDate), m.ClosingDate) OpeningDate, m.ClosingDate, 
ISNULL((select COUNT(*) 
    from mydb1 s 
    where s.dateCreated < DATEADD(dd, -29, m.ClosingDate) 
     and (s.dateClosed is null or s.dateClosed >= DATEADD(dd, 1, m.ClosingDate)) 
), 0) [Total Open 30+ Days] 
from Months m 

为了清楚起见,我只包括一个聚合,并省略了你的连接和分组。

+0

此查询在MS Excel中作为外部Microsoft Query。根据我的研究,使用CTE不起作用。你知道这是否是MS Excel中的一个选项吗?我能够获得我想要的数据,我只想让我的查询比现在好得多。我也觉得这是一些新的程序员可以学习的东西。 –

+0

如果您可以创建使用CTE的视图,则可以从Microsoft Query中引用该视图。或者,您可以消除公式中的Microsoft Query,并使用比ODBC更多功能的驱动程序直接连接到数据库。根据您使用的数据库和驱动程序,[您可能还需要在CTE开始之前加上分号](http://stackoverflow.com/questions/3363704/incorrect-syntax-near-the-keyword-with- SQL)。 –