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统计信息,看看您是否对性能满意; 如果没有,也许可以调查上述选项之一.
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)