我想把RuntimePercentage列添加到我現有的Uptime查詢中,用于一份報告。下面是我現在使用的查詢。要做到這一點,我需要加入另一個表的結果來實作,但我沒能找到解決方案。where子句給了我一個錯誤,因為UptimeMin只在表a中。
RuntimePercentage的計算方法是:
(IdletimeMin/60) IdletimeHours - Total current monthly hours /UptimeMin/60 UptimeHours =RuntimePercentage
當前正常運行時間查詢
SELECT
a.StackNbr,
(SUM(a.UptimeMin)) / 60 UptimeHours,
ROUND((SUM(a. UptimeMin) / ((DATEDIFF(d, DATEADD(月, DATEDIFF(月, 0, getDate()), 0), DATEADD(month, DATEDIFF(month, -1, GETDATE() ), -1) * 24) * 60)) * 100, 2) 正常運行時間百分比。
(((DATEDIFF(d, DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)。DATEADD(月, DATEDIFF(月, -1, GETDATE()), -1) * 24) * 60) - SUM(a.UptimeMin)) / 60 DowntimeHours,
ROUND((((DATEDIFF(d, DATEADD(month, DATEDIFF(month, 0, GETDATE()>, 0)。DATEADD(月, DATEDIFF(月, -1, GETDATE()), -1) * 24) * 60) - SUM(a.UptimeMin)) / ((DATEDIFF(d, DATEADD(月, DATEDIFF(月, 0, GETDATE()), 0), DATEADD(month, DATEDIFF(month, -1, GETDATE() ), -1) * 24) * 60) * 100, 2) 停機時間百分比(DowntimePercentage)。
COUNT(UptimeMin) 數值
FROM(UptimeMin)
積累的正常運行時間
WHERE[/span
a.UptimeMin > 0
AND a. DateTm BETWEEN DATEADD(month, DATEDIFF(month, 0, GETDATE()>, 0)
AND DATEADD(month, DATEDIFF(month, -1, GETDATE()>, -1)
GROUPBY
a.StackNbr
ORDER BY a.StackNbr
a.StackNbr
目前的查詢結果是:
StackNbr / UptimeHours / UptimePercentage / DowntimeHours / DowntimePercentage / Count
1 / 85.335 / 12。 26 / 610.665 / 87. 74 / 1077[/span
2 / 13.457 / 1. 93 / 682.543 / 98. 07 / 185
3 / 9.998 / 1. 44 / 686.002 / 98. 56 / 137
4 / 89.121 / 12。 8 / 606.879 / 87. 2 / 1096
當前idletime查詢
SELECT
StackNbr,
(SUM(IdletimeMin)) / 60 IdletimeHours,
ROUND((SUM(IdletimeMin) / ((DATEDIFF(d, DATEADD(月, DATEDIFF(月, 0, GETDATE(), 0), DATEADD(month, DATEDIFF(month, -1, GETDATE()), -1) * 24) * 60)) * 100, 2) IdletimePercentage。
COUNT(IdletimeMin) Count
FROM(IdletimeMin)
疊加時間
WHERE[/span
IdletimeMin >/span> 0
AND DateTm BETWEEN DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
AND DATEADD(month, DATEDIFF(month, -1, GETDATE()>, -1)
GROUPBY
堆疊Nbr
ORDER BY 堆疊房Nbr
疊加Nbr
當前的查詢結果
StackNbr / IdletimeHours/ IdletimePercentage/ Count
1 / 112. 531 / 16.17 / 1363[/span
2 / 190. 464 / 27.37 / 2278[/span
3 / 195. 588 / 28.1 / 2336
4 / 116. 015 / 16.67 / 1403
uj5u.com熱心網友回復:
從你的問題中我可以看出,你只是想在你的兩個資料集之間進行一個直接的連接,你通過使用它們作為子查詢來實作,如下圖所示。我并不完全確定你想如何計算 "當前每月總時數",因此添加了幾個選項。
我個人建議高度拆分你的日期計算,這樣你只需執行一次,而不是一次又一次地重復這種復雜的邏輯,這不僅使查詢難以閱讀,而且意味著潛在的錯誤是巨大的。
SELECT X.*, Y.*
-- 使用該月的總時數進行計算。
, (Y. IdletimeHours - ((DATEDIFF(day,DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0),DATEADD(month, DATEDIFF(month, -1, GETDATE()) 。-1)) 1)*24)/X. UptimeHours) RuntimePercentage
-- 使用該月至今的小時數進行計算。
, (Y. IdletimeHours - ((DATEDIFF(日,DATEADD(月, DATEDIFF(month, 0, GETDATE()), 0) 。CONVERT(date, GETDATE())) 1)*24)/X. UptimeHours) RuntimePercentage
FROM (
SELECT a.StackNbr
, (SUM(a.UptimeMin))/60 UptimeHours
, ROUND((SUM(a. UptimeMin) / ((DATEDIFF(d,DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0),DATEADD(month, DATEDIFF(month, -1, GETDATE() ), -1) * 24) * 60))*100,2) 正常運行時間百分比
, (((DATEDIFF(d,DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) 。 DATEADD(月, DATEDIFF(月, -1, GETDATE()), -1) * 24) * 60) - SUM(a.UptimeMin))/ 60 DowntimeHours
, ROUND((((DATEDIFF(d,DATEADD(month, DATEDIFF(month, 0, GETDATE()>, 0)。 DATEADD(月, DATEDIFF(月, -1, GETDATE()), -1) * 24) * 60) - SUM(a.UptimeMin)) / ((DATEDIFF(d,DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0),DATEADD(month, DATEDIFF(month, -1, GETDATE() ), -1) * 24) * 60) * 100,2) 停機時間百分比
, COUNT(UptimeMin) [Count] 。
FROM IngStackerUptime a
WHERE a.UptimeMin > 0 AND a. DateTm BETWEEN DATEADD(month, DATEDIFF(month, 0, GETDATE()>, 0) AND DATEADD(month, DATEDIFF(month, -1, GETDATE()>, -1)
GROUP BY a.StackNbr
) X
INNER JOIN (
SELECT StackNbr
, (SUM(IdletimeMin)) / 60 IdletimeHours
, ROUND((SUM(IdletimeMin) / ( (DATEDIFF(d, DATEADD(月, DATEDIFF(月, 0, GETDATE(), 0), DATEADD(month, DATEDIFF(month, -1, GETDATE()), -1) * 24) * 60)) * 100, 2) 時間百分比(IdletimePercentage
, COUNT(IdletimeMin) Count
FROM IngStackerIdletime
WHERE IdletimeMin > 0 AND DateTm BETWEEN DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0) AND DATEADD(month, DATEDIFF(month, -1, GETDATE()>, -1)
GROUP BY StackNbr
) Y on Y.StackNbr = X.StackNbr
ORDER BY X.StackNbr。
下面是一些骨架代碼,你可以將日期計算提取出來,以避免重復計算:
SELECT X.*, Y.*
FROM (
VALUES (DATEADD(month, DATEDIFF(month, 0, GETDATE().) 0), DATEADD(month, DATEDIFF(month, -1, GETDATE()), -1)
) D (StartDate, EndDate)
CROSS APPLY (
SELECT a.StackNbr
FROM IngStackerUptime a
WHERE a.UptimeMin > 0 AND a. DateTm BETWEEN D.StartDate and D.EndDate
GROUP BY a.StackNbr
) X
CROSS APPLY (
SELECT StackNbr
FROM IngStackerIdletime
WHERE IdletimeMin > 0 AND DateTm BETWEEN D. AND D.EndDate
GROUP BY StackNbr
) Y
WHERE Y.StackNbr = X.StackNbr
ORDER BY X.StackNbr。
注意:一致的布局、套管和格式使查詢更容易閱讀和管理。
另外,我不喜歡BETWEEN,因為它不直觀地說明了邊界是什么,而且如果你不小心在你的日期時間范圍中出現了時間成分,它就不能發揮作用。Date >= Startdate and Date < dateadd(day, 1, EndDate)更加明顯和可靠(或者Date >= Startdate and Date < dateadd(month, 1, StartDate))。
uj5u.com熱心網友回復:
SELECT a. StackNbr, (Sum(a.UptimeMin))/60 UptimeHours,
round((Sum(a. UptimeMin) / ((DATEDIFF(d,DATEADD(month, DATEDIFF(month, 0, getDate()), 0),DATEADD(月, DATEDIFF(月, -1, getDate()), -1) * 24) * 60))*100,2) 正常運行時間百分比。
(((DATEDIFF(d,DATEADD(month, DATEDIFF(month, 0, getDate()), 0) 。 DATEADD(月, DATEDIFF(月, -1, getDate()), -1) * 24) * 60) - Sum(a.UptimeMin))/60 DowntimeHours。
Round((((DATEDIFF(d,DATEADD(month, DATEDIFF(month, 0, getDate()), 0) 。 DATEADD(月, DATEDIFF(月, -1, getDate()), -1) * 24) * 60) - sum(a.UptimeMin)) / ((DATEDIFF(d,DATEADD(month, DATEDIFF(month, 0, getDate()), 0),DATEADD(月, DATEDIFF(月, -1, getDate()), -1) * 24) * 60) * 100,2) 停工時間百分比。
(Sum(b.IdletimeMin))/60b. IdletimeHours, round((Sum(b.IdletimeMin) / ((DATEDIFF(d,DATEADD(b. 月, DATEDIFF(b.month, 0, getDate()), 0),DATEADD(b.month, DATEDIFF(b.month, -1, getDate()) * 24) * 60))*100,2) b.IdletimePercentage,
Count (b.IdletimeMin) Count
Count (UptimeMin) Count
From IngStackerUptime a
,IngStackerIdletime b
Where a.UptimeMin >/span> 0 and a. DateTm Between DATEADD(month, DATEDIFF(month, 0, getDate()>, 0) and DATEADD(month, DATEDIFF(month, -1, getDate()), -1)
and a.stacknbr = b.stacknbr
and b.IdletimeMin >/span> 0 and b. DateTm Between DATEADD(b.month, DATEDIFF(b.month, 0, getDate()), 0) and DATEADD(b.month, DATEDIFF(b.month, -1, getDate()), -1)
Group by a.StackNbr Order by a.StackNbr
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/311078.html
標籤:
上一篇:使用父級ID連接行
