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
計算結果でグループ化する必要があります。出来ますか ?
前もって感謝します
確かに、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統計を調べることです。そうでない場合は、おそらく上記のオプションのいずれかを調査します。
あなたがしたい場合は 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
これにはいくつかの方法があります-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