2016-12-06 120 views
0

我試圖從表中獲取隨時間變化的也是SQL Server的Windows服務器的百分比。雖然我可以得到聚合數學,但我無法讓GROUP BY去計算每個獨特的報告日期。有沒有另一種方法來做到這一點?我不想使用case函數,因爲報表日期是迭代的並且是動態的(時間戳),並且每次生成新報表時我都必須修改語句。劃分兩個SQL選擇語句並按日期字段(或類別)對結果進行分組

這裏是我的數據集:

[IP Address] | [OS] | [SQL Server] | [Report Date] 
127.1.1.0 | Win2k12 | 1 | 9/1/2016 
127.1.1.1 | Win2k12 | 0 | 9/1/2016 
127.1.1.3 | Win2k12 | 1 | 9/1/2016 
127.1.1.4 | Win2k12 | 0 | 9/1/2016 
127.1.1.5 | Win2k12 | 0 | 9/1/2016 
127.1.1.0 | Win2k12 | 1 | 10/1/2016 
127.1.1.1 | Win2k12 | 0 | 10/1/2016 
127.1.1.3 | Win2k12 | 1 | 10/1/2016 
127.1.1.4 | Win2k12 | 0 | 10/1/2016 
127.1.1.5 | Win2k12 | 0 | 10/1/2016 
127.1.1.6 | Win2k12 | 0 | 10/1/2016 
127.1.1.7 | Win2k12 | 1 | 10/1/2016 

這裏是我迄今:

SELECT 
      (SELECT CAST(COUNT(DISTINCT [IP Address]) AS FLOAT(4)) 
      FROM ediscov_report 
      WHERE [SQL Server] = 1 
       AND (DATEPART(MONTH, (DATEADD(M, +2, [Report Date]))) = (DATEPART(MONTH, GETDATE()))) 
       AND (DATEPART(YEAR, [Report Date]) = (DATEPART(year, GETDATE())))); 

(SELECT CAST(COUNT(DISTINCT [IP Address]) AS FLOAT(4)) 
FROM ediscov_report 
WHERE (DATEPART(MONTH, (DATEADD(M, +2, [Report Date]))) = (DATEPART(MONTH, GETDATE()))) 
     AND (DATEPART(YEAR, [Report Date]) = (DATEPART(year, GETDATE())))); 

這裏是我試圖讓結果:

[Report Date] | [PCT SQL]<BR> 9/1/2016 | .4<BR> 10/1/2016 | .428571 

回答

0

你應該能夠通過簡單的聚合功能完成此操作:

Select ReportDate, 
     count(*) as numservers, 
     sum(SQLServer) as num_SQLServers, 
     avg(SQLServer * 1.0) as p_SQLSever 
From ediscov_report 
group by ReportDate 
order by ReportDate; 
+0

這很接近,但我沒有得到正確的數字。主要原因是因爲報告中有重複。同一臺服務器可能會出現多次。我改變了計數(*)來統計(不同的IP地址),這給了我合適數量的服務器,但重複數據影響了Sum SQLServer的數量和平均值。如果我們能找出一種方法來爲獨特的主機做數學運算,那麼我們應該得到正確的數值。我會玩弄這個,看看我能否弄清楚。感謝您的幫助!我不會想到嘗試這種方法。 – npeach

+0

我將此標記爲本示例所用答案。以我提供的數據集爲例,這完美地工作。但是我有真正的數據集有重複的行,拋出計算。感謝您的幫助!我想我知道我現在需要怎樣處理它。 – npeach

0

你試過下面的查詢

SELECT [Report Date], (SQLServer/TotalServer) as Percentage FROM (
SELECT [Report Date], 
(SELECT COUNT(DISTINCT[IP Address]) FROM ediscov_report WHERE [SQL Server]=1) as SQLServer, 
(SELECT COUNT(DISTINCT [IP Address]) FROM ediscov_report) as TotalServer 
from ediscov_report 
group by [Report Date]) 
order by [Report Date] 
+0

你能解釋一下你的解決方案嗎? – zuazo

+0

這也非常接近。我遇到的問題是百分比字段以int數據類型解析爲1或0。我試圖圍繞它轉換爲浮動,但這也不起作用。我得到的結果是9/1/2016 | 0和10/1/2016 |報告日期和百分比列爲0。 – npeach

+0

嗨,試試這個新的查詢 –

0

我想後我想出了把我的真實數據的情況下有人用重複的行同樣的問題的解決方案。在我的情況下,掃描報告可能會將多行唯一信息綁定回相同的IP地址。

選擇ReportDate, 計數(不同[IP地址])作爲numHosts, 計數(不同(情況下,當[SQLServer的] = 1,則[IP地址]端)),爲numSQLServer, 鑄造(計數(不同(情況當[SQLServer] = 1,然後[IP地址]結束))作爲float(4))/ cast(count(distinct [IP Address])作爲float(4))作爲p_SQLServer 來自ediscov_report group by ReportDate order by ReportDate ;