这种情况SQL如何计算? [关闭]
Posted
技术标签:
【中文标题】这种情况SQL如何计算? [关闭]【英文标题】:How to calculate this situation SQL? [closed] 【发布时间】:2020-08-22 06:11:48 【问题描述】:我需要帮助查询情况,计算情况我不知道如何查询情况。
请任何帮助我继续这个项目,你可以指导我并为我举例
这是我拥有的数据样本:
Date Usage Plan
------------------------
2020-04-30 NULL 94928
2020-05-01 NULL NULL
2020-05-02 NULL NULL
2020-05-03 12269 NULL
2020-05-04 3253 NULL
2020-05-05 NULL NULL
2020-05-06 NULL NULL
2020-05-07 NULL NULL
2020-05-08 500 1000
2020-05-09 NULL NULL
2020-05-10 NULL NULL
2020-05-11 NULL NULL
所需的输出如下所示:
Date Usage Plan
-----------------------
2020-04-30 NULL 94928
2020-05-01 NULL 94928
2020-05-02 NULL 94928
2020-05-03 12269 82659
2020-05-04 3253 79406
2020-05-05 NULL 79406
2020-05-06 NULL 79406
2020-05-07 NULL 79406
2020-05-08 500 1000
2020-05-09 NULL 500
2020-05-10 NULL 500
2020-05-11 NULL 500
为示例数据创建表脚本:
CREATE TABLE [dbo].[Table_1]
(
[id] [int] IDENTITY(1,1) NOT NULL,
[Date] [date] NULL,
[ITEM_NUMBER] [varchar](max) NULL,
[Plan_Matusage] [int] NULL,
[St_plan] [int] NULL,
[St_revise] [int] NULL,
[St_actual] [int] NULL,
)
【问题讨论】:
什么条件导致计划获取值79406
?
@vvvv4d 条件此计划 - 用法
【参考方案1】:
您可以使用窗口函数。这个想法是构建相邻记录组,其窗口总和对于每个非空 plan
递增:
select
date,
usage,
coalesce(
plan,
max(plan) over(partition by grp)
- coalesce(sum(usage) over(partition by grp order by date), 0)
) plan
from (
select
t.*,
sum(case when plan is not null then 1 else 0 end) over(order by date) grp
from mytable t
) t
order by date
【讨论】:
【参考方案2】:这行得通
with plan_group_cte as (
select t.*, sum(iif([Plan] is not null, 1, 0)) over(order by [Date]) plan_group
from dbo.Table_1 t)
select [Date], [Usage],
coalesce([Plan], (max([Plan]) over (partition by plan_group)-
sum(cast([Usage] as int)) over (partition by plan_group order by [Date]))) [Plan]
from plan_group_cte
order by 1;
【讨论】:
以上是关于这种情况SQL如何计算? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章