如何按计算字段分组

Jon*_*nny 25 sql t-sql sql-server 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
Run Code Online (Sandbox Code Playgroud)

而不是group by mwspp.DateDue我需要按计算结果分组.可能吗 ?

提前致谢

Ian*_*ton 34

当然,只需在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)))
Run Code Online (Sandbox Code Playgroud)

评论后编辑:

像所有关于优化器的问题一样,答案实际上是"它取决于",但很可能它只执行一次 - 您将在执行计划中将其视为计算标量运算符.

根据此Compute Scalar操作,优化器将决定如何执行实际聚合.

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

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

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

  • @MarkBannister,同意,这就是我希望在编辑后的评论中提到的重点;人们会希望优化器在物理操作方面将其平等对待。因此,除了对用户而言最具可读性/效率的东西之外,如果我自己这样做,我将考虑将CTE用于除琐碎的复杂情况之外的其他任何事情。 (2认同)

Tar*_*ryn 19

如果你想进行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
Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)

  • cte 代表什么? (2认同)