Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 应用金额(其中日期介于日期1和日期2之间)_Sql_Sql Server_Tsql_Sum - Fatal编程技术网

Sql 应用金额(其中日期介于日期1和日期2之间)

Sql 应用金额(其中日期介于日期1和日期2之间),sql,sql-server,tsql,sum,Sql,Sql Server,Tsql,Sum,我的表当前看起来如下所示: +---------+---------------+------------+------------------+ | Segment | Product | Pre_Date | ON_Prepaid | +---------+---------------+------------+------------------+ | RB | 01. Auto Loan | 2020-01-01 | 10645976180.000

我的表当前看起来如下所示:

+---------+---------------+------------+------------------+
| Segment |    Product    |  Pre_Date  |    ON_Prepaid    |
+---------+---------------+------------+------------------+
| RB      | 01. Auto Loan | 2020-01-01 | 10645976180.0000 |
| RB      | 01. Auto Loan | 2020-01-02 |  4489547174.0000 |
| RB      | 01. Auto Loan | 2020-01-03 |  1853117000.0000 |
| RB      | 01. Auto Loan | 2020-01-04 |  9350258448.0000 |
+---------+---------------+------------+------------------+
我试图计算7天内“ON_预付费”的值,比如从“2020-01-01”到“2020-01-07”。 这是我试过的

drop table if exists ##Prepay_summary_cash
    select *,
    [1W_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 1 following and 7 following), 
    [2W_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 8 following and 14 following),
    [3W_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 15 following and 21 following),
    [1M_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 22 following and 30 following),
    [1.5M_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 31 following and 45 following),
    [2M_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 46 following and 60 following),
    [3M_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 61 following and 90 following),
    [6M_Prepaid] = sum(ON_Prepaid) over (partition by SEGMENT, PRODUCT order by PRE_DATE rows between 91 following and 181 following)
    into ##Prepay_summary_cash 
    from ##Prepay1
如果日期是连续的,事情应该是好的;然而,在“Pre_Date”中有一些日子不见了,你知道银行星期天不营业,等等

所以我正在努力做类似的事情

[1W] = SUM(ON_Prepaid) over (where Pre_date between dateadd(d,1,Pre_date) and dateadd(d,7,Pre_date))
差不多吧。因此,如果2020-01-05本身没有记录,那么结果应该只对2020年1月1,2,3,4,6,7日的日期求和,而不是1,2,3,4,6,7,8日,因为后面的第7行。或者,例如,我在30天或其他时间内丢失了记录,那么所有这30天都应该加起来为0。所以45天应该只返回15天的值。 我试着在整个论坛上查找,但答案并不充分。你们能帮帮我吗?或者将我链接到问题已经解决的线程

非常感谢你

如果日期是连续的,事情应该是好的

然后使它们连续。左键将实际数据分组,使其每天在日历表上显示一行,制作一行,或使用递归cte从X生成360个日期的列表,这样您的查询就会成功

WITH d as 
( 
  SELECT * 
  FROM 
    (
      SELECT * 
      FROM cal 
      CROSS JOIN 
      (SELECT DISTINCT segment s, product p FROM ##Prepay1) x
    ) c
    LEFT JOIN ##Prepay1 p 
    ON 
      c.d = p.pre_date AND 
      c.segment = p.segment AND 
      c.product = p.product
  WHERE 
    c.d BETWEEN '2020-01-01' AND '2021-01-01' -- date range on c.d not c.pre_date
)

--use d.d/s/p not d.pre_date/segment/product in your query (sometimes the latter are null)
select *,
[1W_Prepaid] = sum(ON_Prepaid) over (partition by s, s order by d.d rows between 1 following and 7 following), 
...
CAL只是一个表,只包含一列日期,每天一列,没有时间,在过去/未来延续n千天

希望注意的是,月份的天数是可变的,所以6百万有点用词不当。。最好是把这个月叫做180D,90D等等

还要指出的是,查询将数据按行划分为多个组。如果要在行日期后180天内执行求和,则需要提取一年的数据,以便在6月180日行上,12月数据可用于从6月起6个月的12月数据求和

如果您想将查询限制为仅显示到6月份的数据,但包括6月份之后6个月的汇总数据,则需要将所有数据重新包装到子查询中。您不能在进行求和的查询中选择jan和jun之间的where,因为where子句在窗口子句之前完成,这样做将在求和之前删除dec数据

Oracle和Postgres让其他一些数据库更容易做到这一点;它们可以在其他行的值与当前行的值在一定距离内的范围内执行求和。SQL server只支持基于行的索引而不是其值的距离。基于值的距离支持仅限于具有相同值的行,而不是值高于或低于当前行的行。我认为交叉应用程序或select中的协调子应用程序可以满足该要求,尽管我会仔细检查性能

SELECT *, 
  (SELECT SUM(tt.a) FROM x tt WHERE t.x = tt.x AND tt.y = t.y AND tt.z BETWEEN DATEADD(d, 1, t.z) AND DATEADD(d, 7, t.z) AS 1W
FROM
  x t

您是否尝试过条件和,例如sumcase when{condition}then value else 0 end?我尝试过,sumcase when pre_date介于dateaddd,1,predate和dateaddd,7之间,predate then ON_preaded else 0 end仅返回0如果您正在评估值而不是行数,您可能希望使窗口函数使用范围而不是行,例如,该条件永远不会满足?““pre_date”永远不会在这个范围内,或者它像datepartweek分区那样简单吗?我设法创建了一个CAL表,是的,问题变得简单多了。但是,CAL交叉连接选择不同段s中的选择d,预付款1 x中的产品p仅返回一个表,其中d列包含从2020-01-01到2021-04-30的日期范围。我设置了截止限值。有没有关于交叉连接如何失败的建议?等等,别介意我从select d from CAL更改为select*from CAL,它成功了。不知道为什么,虽然这是我的错别字;你的修正是正确的。这纯粹是因为,尽管cal交叉连接从。。。是3列,1来自cal,2来自distinct子查询,只选择d,然后丢弃交叉连接的列。。选择*,或选择cal.d、x.p、x.s将允许日期和产品/细分市场通过