如何按计算字段分组

时间:2013-04-09 11:48:11

标签: sql sql-server tsql group-by

我需要按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 个答案:

答案 0 :(得分:29)

当然,只需将相同的计算添加到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可能会以不同方式对待它们,但这不太可能。但是,它们有助于提高可读性。

如果您担心效率,可以查看几个选项,例如:将计算设置为persisted computed column并在索引中使用此计算,或将临时结果添加到临时表中。

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

答案 1 :(得分:18)

如果你想GROUP BY日期加法计算,那么你需要将该公式放在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

答案 2 :(得分:3)

有几种方法可以做到这一点 - 一种方法是使用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

答案 3 :(得分:2)

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

替换

group by mwspp.DateDue

group by dateadd(day, -7, Convert(DateTime, mwspp.DateDue) + (7 - datepart(weekday, mwspp.DateDue)))