繁体   English   中英

如何计算一列SQL的总和?

[英]How to calculate the sum of a column SQL?

需要一些帮助。

我的桌子如下->

项目名称 日期 记录时间 计划时间 剩余_小时
民用 06-03-2022 5个 10 5个
民用 07-03-2022 3个 7 4个
民用 08-03-2022 9 9 0
民用 09-03-2022 4个 10 6个
民用 10-03-2022 8个 5个 -3
民用 11-03-2022 8个 8个 0
民用 12-03-2022 0 5个 -5
民用 13-03-2022 0 4个 -4
民用 14-03-2022 0 3个 -3
民用 15-03-2022 0 4个 -4
民用 15-03-2022 0 5个 -5

这里我只有一个项目,但实际上我有多个项目。

在此表中, Recorded_Hours是每天完成的总小时数, Planned_Hours是每天计划的总小时数, Remaining_Hours是( Planned_Hours - Recorded_Hours )。 我想总结直到今天的所有Remaining_Hours然后将该总和平均分配给每个未来的Planned_Hours

在上表中,到今天为止的Remaining_Hours总和为12 ,还有5 天可以完成该项目。 我想将12/5添加到每5 天剩余的 Planned_Hours中。 这应该每天自动计算。

我的 output 将是 ->

项目名称 日期 记录时间 计划时间 剩余_小时
民用 06-03-2022 5个 10 5个
民用 07-03-2022 3个 7 4个
民用 08-03-2022 9 9 0
民用 09-03-2022 4个 10 6个
民用 10-03-2022 8个 5个 -3
民用 11-03-2022 8个 8个 0
民用 12-03-2022 0 7.4 -7.4
民用 13-03-2022 0 6.4 -6.4
民用 14-03-2022 0 5.4 -5.4
民用 15-03-2022 0 6.4 -6.4
民用 15-03-2022 0 7.4 -7.4

到现在为止我已经达到了这一点

SELECT 
 [Project_Name]= CASE WHEN GROUPING(Date) = 0 THEN [Project_Name]ELSE 'Total' END,
  Date,
  [Remaining_Hours] = SUM([Planned_Hours]-[Recorded_Hours])
FROM[dbo].[Projects]

GROUP BY GROUPING SETS (
    ([Project_Name], Date),
    ([Project_Name]));

首先,您找到每个项目截至今天的总剩余小时数 (GROUP BY)

select Project, Total_Remaining_Hours = sum(Remaining_Hours),
from   Projects
where  [Date] <= @today 
group by Project

那么你还需要剩余天数

select Project, Remaining_Days = count(*)
from   Projects
where  [Date] > @today 
group by Project

将它们组合在一起(INNER JOIN)并使用CASE表达式进行检查,忽略过去的日期并仅调整未来的日期

declare @today date = getdate();

select *,
       New_Planned_Hours = case when p.[Date] <= @today
                                then p.Planned_Hours
                                else p.Planned_Hours 
                                +    (t.Total_Remaining_Hours / d.Remaining_Days)
                                end
from   Projects p
       inner join
       (
          select Project,
                 Total_Remaining_Hours = sum(Remaining_Hours)
          from   Projects
          where  [Date] <= @today
          group by Project
       ) t  on p.Project = t.Project
       inner join
       (
          select Project,
                 Remaining_Days = count(*)
          from   Projects
          where  [Date] > @today
          group by Project
       ) d  on p.Project = d.Project
order by p.Project, p.[Date]

数据库<>小提琴演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM