web-dev-qa-db-ja.com

計算フィールドでグループ化する方法

SQL Server 2005/2008の計算フィールドでグループ化する必要があります。

私は次のSQLを持っています:

select dateadd(day, -7, Convert(DateTime, mwspp.DateDue) + (7 - datepart(weekday, mwspp.DateDue))),
sum(mwspp.QtyRequired)
from manufacturingweekshortagepartpurchasing mwspp
where mwspp.buildScheduleSimID = 10109 and mwspp.partID = 8366
group by mwspp.DateDue
order by mwspp.DateDue

の代わりに group by mwspp.DateDue計算結果でグループ化する必要があります。出来ますか ?

前もって感謝します

23
Jonny

確かに、GROUP BY句に同じ計算を追加するだけです:

select dateadd(day, -7, Convert(DateTime, mwspp.DateDue) + (7 - datepart(weekday, mwspp.DateDue))),
sum(mwspp.QtyRequired)
from manufacturingweekshortagepartpurchasing mwspp
where mwspp.buildScheduleSimID = 10109 and mwspp.partID = 8366
group by dateadd(day, -7, Convert(DateTime, mwspp.DateDue) + (7 - datepart(weekday, mwspp.DateDue)))
order by dateadd(day, -7, Convert(DateTime, mwspp.DateDue) + (7 - datepart(weekday, mwspp.DateDue)))

コメントの後に編集:

オプティマイザーに関するすべての質問と同様に、答えは本当に「それは依存します」ですが、ほとんどの場合一度だけ実行されます-これは実行計画でCompute Scalar演算子。

このCompute Scalar操作に基づいて、オプティマイザーは実際の集計の実行方法を決定します。

ここの他の回答(CTE /サブクエリなど)はすべて同じように有効ですが、実際にはロジックを変更しないでください。最終的には、同様の操作を実行します。 SQL Serverはそれらを異なる方法で処理する可能性がありますが、可能性は低いです。ただし、読みやすさには役立ちます。

効率が心配な場合は、いくつかのオプションをご覧ください。 永続計算列 として計算を設定し、これをインデックスで使用するか、中間結果を一時テーブルに追加します。

本当に確実に知る唯一の方法は、一般的なデータセットでクエリを実行し、パフォーマンスに満足しているかどうかを確認するときに、実行プラン/ IO統計を調べることです。そうでない場合は、おそらく上記のオプションのいずれかを調査します。

32
Ian Preston

あなたがしたい場合は GROUP BY dateadd計算、その後、その式をGROUP BY句を使用するか、クエリを別のSELECTでラップできます。

select DateCalc,
  sum(QtyRequired) TotalQty
from
(
  select mwspp.DateDue,
    dateadd(day, -7, Convert(DateTime, mwspp.DateDue) + (7 - datepart(weekday, mwspp.DateDue))) DateCalc,
    mwspp.QtyRequired
  from manufacturingweekshortagepartpurchasing mwspp
  where mwspp.buildScheduleSimID = 10109 
    and mwspp.partID = 8366
) src
group by DateCalc
order by DateCalc
18
Taryn

これにはいくつかの方法があります-1つはCTEの使用を伴います:

with cte as 
(select m.*, 
        dateadd(day, -7, Convert(DateTime, DateDue) + (7 - datepart(weekday, DateDue))) datecalc
 from manufacturingweekshortagepartpurchasing m)
select datecalc, sum(QtyRequired)
from cte
where buildScheduleSimID = 10109 and partID = 8366
group by datecalc
order by datecalc
4
user359040