【问题标题】:Count of SQL Server OS types for each month of last 12 months过去 12 个月中每个月的 SQL Server 操作系统类型计数
【发布时间】:2016-07-19 11:28:11
【问题描述】:

我的任务是创建一个报告,该报告应显示过去 12 个月中每个月在我们环境中的不同操作系统类型的 SQL Server。

我创建了下表,并且每天都会在其中加载数据:

我需要获取过去 12 个月的每个月的操作系统类型,以便以以下格式显示:

我写了以下查询,但它是错误的。我遇到的难题是如何获取每个月最后一次数据收集的操作系统类型计数(不是每个月的最后一天),并以Mon YYYY 格式显示日期。我使用 SQL Server 2008 R2。有什么想法吗?

WITH cte AS (
    SELECT OSVer = CASE OSVer
                       WHEN '5.0.2195' THEN 'Windows Server 2000'
                       WHEN '5.2.3790' THEN 'Windows Server 2003'
                       WHEN '6.0.6002' THEN 'Windows Server 2008'
                       WHEN '6.1.7600' THEN 'Windows Server 2008 R2'
                       WHEN '6.1.7601' THEN 'Windows Server 2008 R2 SP1'
                       WHEN '6.2.9200' THEN 'Windows Server 2012'
                       WHEN '6.3.9600' THEN 'Windows Server 2012 R2'
                       ELSE OSVer
                  END,
           Date,
           ROW_NUMBER() OVER (PARTITION BY DATEDIFF(DAY, 0, Date) ORDER BY Date DESC) as rn
    FROM dbo.SQLMachines
    WHERE OSName IS NOT NULL
)
SELECT OSVer, Count(OSVer) AS 'Count', Date
FROM cte
where rn = 1
GROUP BY OSVer, Date 
ORDER BY Date DESC

【问题讨论】:

    标签: sql-server tsql sql-server-2008-r2


    【解决方案1】:

    使用窗口函数获取每个月的最后一天的数据,并使用它来选择适当的行:

    WITH cte AS (
        SELECT OSVer = CASE OSVer
                           WHEN '5.0.2195' THEN 'Windows Server 2000'
                           WHEN '5.2.3790' THEN 'Windows Server 2003'
                           WHEN '6.0.6002' THEN 'Windows Server 2008'
                           WHEN '6.1.7600' THEN 'Windows Server 2008 R2'
                           WHEN '6.1.7601' THEN 'Windows Server 2008 R2 SP1'
                           WHEN '6.2.9200' THEN 'Windows Server 2012'
                           WHEN '6.3.9600' THEN 'Windows Server 2012 R2'
                           ELSE OSVer
                      END,
               Date,
               MAX(Date) OVER (PARTITION BY YEAR(Date), MONTH(Date)) as maxDay
        FROM dbo.SQLMachines
        WHERE OSName IS NOT NULL
    )
    SELECT OSVer, Count(OSVer) AS cnt, CAST(Date a Date)
    FROM cte
    WHERE CAST(Date as Date) = CAST(MaxDay as Date)
    GROUP BY OSVer, CAST(Date a Date) 
    ORDER BY CAST(Date as Date) DESC;
    

    仅当Date 具有时间组件时才需要cast()s。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      相关资源
      最近更新 更多