41

我需要按 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我需要按计算结果分组。是否可以 ?

提前致谢

4

4 回答 4

47

当然,只需在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)))

评论后编辑:

像所有关于优化器的问题一样,答案实际上是“视情况而定”,但很可能它只会执行一次 - 您将在执行计划中将其视为计算标量运算符。

基于这个计算标量操作,优化器将决定如何执行实际的聚合。

这里的其他答案(CTE/子查询等)都同样有效,但并没有真正改变逻辑——最终它们将执行类似的操作。SQL Server 可能会以不同的方式对待它们,但不太可能。但是,它们将有助于提高可读性。

如果您担心效率,您可以查看几个选项,例如将计算设置为持久计算列并在索引中使用它,或者将中间结果添加到临时表中。

真正确定的唯一方法是在对典型数据集运行查询时检查执行计划/IO 统计信息,看看您是否对性能感到满意;如果没有,也许调查上述选项之一。

于 2013-04-09T11:51:15.997 回答
22

如果要进行GROUP BYdateadd 计算,则需要将该公式放在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
于 2013-04-09T11:51:30.377 回答
5

有几种方法可以这样做 - 一种涉及使用 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
于 2013-04-09T11:53:41.493 回答
2

只需将计算放在GROUP BY子句中:

代替

group by mwspp.DateDue

group by dateadd(day, -7, Convert(DateTime, mwspp.DateDue) + (7 - datepart(weekday, mwspp.DateDue)))
于 2013-04-09T11:53:46.327 回答