2016-07-19 9 views
1

過去12か月間の各月のSQL Serverの異なるオペレーティングシステムタイプを表示するレポートを作成する作業があります。過去12か月間の各月のSQL Server OSタイプの数

私は、次の表を作成し、データは毎日の内側にロードされます。 enter image description here

私は次の形式で表示される最後の12ヶ月間の各月のOSの種類を取得する必要があります: enter image description here

次のクエリを書きましたが、間違っています。私が持っている苦労は、毎月の最後のデータ収集(毎月の最後の日ではない)のOSタイプを取得し、フォーマットを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 

答えて

0

使用ウィンドウ関数は、各月のデータで最終日を取得し、適切な行を選択するためにそれを使用するには:Dateは時間コンポーネントを持つ場合

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; 

cast()秒しか必要とされています。

+0

これはうまくいった!ありがとう! –

関連する問題