2017-07-12 10 views
0

私はいくつかのクエリを持ち、その出力を結合体と結合します。 しかし、それは私のデータベースサーバー上のCPUを食べている。複数の重複する日付範囲を別個の列として選択する

可能であれば、すべてのユニオンを削除して1つのステートメントにまとめたいとします。ここで

は、クエリは、次のとおりです。

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文の中にすべてのそれらの日付範囲を組み合わせるための方法はありますか?または、 "from"と "to"の列を持つ日付カテゴリ(WTD、MTD、QTDなど)を持つ一時テーブルを作成する必要がありますか?

私は、組合なしでこの結果をどのように達成できるのか正確にはわかりません。

SELECTで表示される日付は、それらを計算してSQLクエリを作成するスクリプトから得られます。

+0

なぜこれを同時に実行する必要がありますか?最適化のために、 'datefiled'の別の名前に基づいて調べる必要がある多くの側面があります。クエリの各部分の結果が一意であると思います。代わりに' union all'を使用することができます。 – LONG

+0

あなたと他の誰かが示唆したように、それをすべて組合に渡します。 私はクエリを試して、実行時間は似ていました。しかし、組合はすべて安価であるので、私はそれを使用します。 これらの出力がチャートにプッシュされます。私は別の要求としてサーバーに各選択を送信し、負荷が緩和されるかどうかを確認することができますね。 – bobby

答えて

0

私が正しく理解している場合は、以下のクエリで結果が得られます。グループをグループ化するか、ロールアップまたはキューブを探していると思います。 1はあなたの条件

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])) 
0

はい、あなたはそれぞれの日付範囲の個別の列を作ることができ、および日付範囲の基準を満たすだけSUM行のために適合するチェック...

(未テスト、構文が正確に右ではないかもしれません)それは重複する行を排除していないため、SQL Serverの新バージョンで
SUM(CASE WHEN ([date] >= '2017-07-10' and [date] < '2017-07-13') THEN QtyMade ELSE 0 END) 

あなたもIIF()

片側ノートを使用することができ、UNION ALLは、UNIONを安価です。

関連する問題