编写此查询的有效方法 - 在创建和修改时审计histroy

时间:2016-12-19 10:58:20

标签: sql sql-server

只是想知道是否有更好更有效的方法来创建此查询,因为下面需要很长时间才能为数据库目录中的每个表运行此查询。谢谢

    Select N'MSCRM_REPORTING'  As [Database], N'dbo' As [Schema], N'apuk_erqanswerBase' As [Table], N'ModifiedOn' As ChangeType,
    sum(case when DATEADD(dd, DATEDIFF(dd, 0,ModifiedOn), 0) between DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0) -7 AND DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)  THEN 1 ELSE 0 END) [0-7 Days],
    sum(case when DATEADD(dd, DATEDIFF(dd, 0,ModifiedOn), 0) between DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)-28 AND DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)- 8 THEN 1 ELSE 0 END) [8-28 Days],
    sum(case when DATEADD(dd, DATEDIFF(dd, 0,ModifiedOn), 0) between DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)-84 AND DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)-29 THEN 1 ELSE 0 END) [29-84 Days],
    sum(case when DATEADD(dd, DATEDIFF(dd, 0,ModifiedOn), 0) between DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)-182 AND DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)-85 THEN 1 ELSE 0 END) [85-182 Days],
    sum(case when DATEADD(dd, DATEDIFF(dd, 0, ModifiedOn), 0) BETWEEN convert(datetime,0) and DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0) - 183 THEN 1 ELSE 0 END) [183+],
    sum(case when ModifiedOn is null then 1 else 0 end) [NullRows],
    count(*) as [RowCount]
    From MSCRM_REPORTING.dbo.apuk_erqanswerBase

2 个答案:

答案 0 :(得分:3)

拥有多个DATEDIFF会很昂贵,所以为什么不尝试在子查询中获取日期之间的差异并在SELECT中使用它:

Select N'MSCRM_REPORTING'  As [Database], N'dbo' As [Schema], N'apuk_erqanswerBase' As [Table], N'ModifiedOn' As ChangeType,
sum(case when a.Days BETWEEN 0 AND 7  THEN 1 ELSE 0 END) [0-7 Days],
sum(case when a.Days BETWEEN 8 AND 28 THEN 1 ELSE 0 END) [8-28 Days],
sum(case when a.Days BETWEEN 29 AND 84 THEN 1 ELSE 0 END) [29-84 Days],
sum(case when a.Days BETWEEN 85 AND 182 THEN 1 ELSE 0 END) [85-182 Days],
sum(case when a.Days >= 183 THEN 1 ELSE 0 END) [183+],
sum(case when ModifiedOn is null then 1 else 0 end) [NullRows],
count(*) as [RowCount]
From 
(
    Select  DATEDIFF(dd, ModifiedOn, getdate()) AS [Days], 
            ModifiedOn
    From    MSCRM_REPORTING.dbo.apuk_erqanswerBase
) a

答案 1 :(得分:0)

你也可以试试这个:

Select N'MSCRM_REPORTING'  As [Database], 
    N'dbo' As [Schema], 
    N'apuk_erqanswerBase' As [Table], 
    N'ModifiedOn' As ChangeType,
    sum(case when DATEDIFF(dd, ModifiedOn, getdate()) BETWEEN 0 AND 7  THEN 1 ELSE 0 END) [0-7 Days],
    sum(case when DATEDIFF(dd, ModifiedOn, getdate()) BETWEEN 8 AND 28 THEN 1 ELSE 0 END) [8-28 Days],
    sum(case when DATEDIFF(dd, ModifiedOn, getdate()) BETWEEN 29 AND 84 THEN 1 ELSE 0 END) [29-84 Days],
    --------------------- 
from MSCRM_REPORTING.dbo.apuk_erqanswerBase