[英]Selecting multiple overlapping date ranges as distinct columns
我有幾個查詢,並將它們的輸出與工會合並。 但是,那吞噬了我的數據庫服務器上的CPU。
我想刪除工會,並在可能的情況下將其全部合並為一個聲明。
以下是查詢:
select [shift],p.wc, (sum(QtyMade) / sum(CREWHrs)) / (max(t.UNITPERHRS) / NULLIF(max(t.CREW),0)) effy ,'YTD' datefield
from Prod p left join #dtl_temp t on p.PN=t.PARTN
where p.wc in ('999') and [date]>= DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()) - 1, 0)
group by p.wc,[shift]
union
select [shift],p.wc, (sum(QtyMade) / sum(CREWHrs)) / (max(t.UNITPERHRS) / NULLIF(max(t.CREW),0)) effy ,'Prior Year' datefield
from Prod p left join #dtl_temp t on p.PN=t.PARTN
where p.wc in ('999') and ([date]>= DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()) - 1, 0) and [date] < DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0))
group by p.wc,[shift]
union
select [shift],p.wc, (sum(QtyMade) / sum(CREWHrs)) / (max(t.UNITPERHRS) / NULLIF(max(t.CREW),0)) effy ,'QTD' datefield
from Prod p left join #dtl_temp t on p.PN=t.PARTN
where p.wc in ('999') and ([date] >= '2017-07-01' and [date] < '2017-07-13')
group by p.wc,[shift]
union
select [shift],p.wc, (sum(QtyMade) / sum(CREWHrs)) / (max(t.UNITPERHRS) / NULLIF(max(t.CREW),0)) effy ,'MTD' datefield
from Prod p left join #dtl_temp t on p.PN=t.PARTN
where p.wc in ('999') and ([date] >= '2017-07-01' and [date] < '2017-07-13')
group by p.wc,[shift]
union
select [shift],p.wc, (sum(QtyMade) / sum(CREWHrs)) / (max(t.UNITPERHRS) / NULLIF(max(t.CREW),0)) effy ,'WTD' datefield
from Prod p left join #dtl_temp t on p.PN=t.PARTN
where p.wc in ('999') and ([date] >= '2017-07-10' and [date] < '2017-07-13')
group by p.wc,[shift]
union
select [shift],p.wc, (sum(QtyMade) / sum(CREWHrs)) / (max(t.UNITPERHRS) / NULLIF(max(t.CREW),0)) effy ,'Prior Quarter' datefield
from Prod p left join #dtl_temp t on p.PN=t.PARTN
where p.wc in ('999') and ([date] >= '2017-04-01' and [date] < '2017-07-01')
group by p.wc,[shift]
輸出為:
shift wc effy datefield
1 999 0.951558640486598 YTD
2 999 0.706728843730067 YTD
3 999 0.831153497545209 YTD
1 999 0.732836888916855 Prior Year
2 999 0.548579728223933 Prior Year
3 999 0.58957623455441 Prior Year
1 999 0.617329386562882 QTD
2 999 0.826112085298484 QTD
3 999 1.0719875569761 QTD
1 999 0.617329386562882 MTD
2 999 0.826112085298484 MTD
3 999 1.0719875569761 MTD
1 999 0.617329386562882 WTD
2 999 0.832089035926471 WTD
3 999 1.0719875569761 WTD
1 999 1.17254367493512 Prior Quarter
2 999 0.939448907844456 Prior Quarter
3 999 1.20640432761946 Prior Quarter
我有辦法以某種方式將所有這些日期范圍合並為CASE語句嗎? 還是我需要使用日期類別(WTD,MTD,QTD等)創建一個臨時表,並在其中列出“從”和“到”列?
我不確定在沒有工會的情況下如何才能實現這一目標。
您在SELECT中看到的日期來自計算它們並創建sql查詢的腳本。
如果我正確理解,將通過以下查詢獲得結果:我認為您正在按分組集,匯總或多維數據集進行分組。 檢查哪一個適合您的要求
select [shift],p.wc, (sum(QtyMade) / sum(CREWHrs)) / (max(t.UNITPERHRS) / NULLIF(max(t.CREW),0)) effy ,'Prior Year' datefield
from Prod p left join #dtl_temp t on p.PN=t.PARTN
where p.wc in ('999')
group by grouping sets ([shift], p.wc,datepart(yyyy,[date]), datepart(qq, [date]), datepart(mm,[date]))
是的,您可以為每個日期范圍創建單獨的列,並且僅滿足日期范圍條件的SUM行(未經測試,語法可能不完全正確)...
SUM( CASE WHEN ([date] >= '2017-07-10' and [date] < '2017-07-13') THEN QtyMade ELSE 0 END )
在較新版本的SQL Server上,您也可以使用IIF()
一方面, UNION ALL
UNION
便宜,因為它不會消除重復的行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.