簡體   English   中英

選擇多個重疊的日期范圍作為不同的列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM