首页 > 解决方案 > 如何显示与所选日期最近的日期

问题描述

我正在尝试在特定日期提取库存。为此,我正在按日期、产品和仓库累计库存变动。

select          m.codart AS REF, 
                m.descart AS 'DESCRIPTION', 
                m.codalm AS WAREHOUSE, 
                m.descalm AS WAREHOUSEDESCRIP, 
                m.unidades AS UNITS, 
                m.entran AS 'IN', 
                m.salen AS 'OUT', 
                m.entran*1 + m.salen*-1 as MOVEMENT,
                (select sum(m1.entran*1 + m1.salen*-1)
                    from MOVSTOCKS m1 
                    where m1.codart = m.codart and m1.codalm = m.codalm and m.fecdoc >= m1.fecdoc) as 'CUMULATIVE',
                m.PRCMEDIO as 'VALUE', 
                m.FECDOC as 'DATE', 
                m.REFERENCIA as 'REF', 
                m.tipdoc as 'DOCUMENT'
    from        MOVSTOCKS m
    where       (m.entran <> 0 or m.salen <> 0)
                and (select max(m2.fecdoc) from MOVSTOCKS m2) < '2020-11-30T00:00:00.000'
    order by    m.fecdoc

如果没有and (select max(m2.fecdoc) from MOVSTOCKS m2) < '2020-11-30T00:00:00.000'它,它会显示这样的数据,这没关系。

REF  WAREHOUSE  UNITS   IN   OUT  MOVEMENT  CUMULATIVE   DATE   
1       0         2      0    2      -2        -7      2020-11-25 
1       1         3      0    3      -3        -3      2020-11-25
1       0         5      0    5      -5        -7      2020-11-25
1       0         9      9    0       9         2      2020-11-26 
2       0         2      2    0       2         2      2020-11-26
1       0         1      1    0       1         3      2020-12-01 

问题是,使用 where 子句中的子选择它不会返回任何结果(我认为这是因为它只是查找最大日期并说它大于 2020-11-30)。我希望它显示与所选日期最接近的日期(所有日期,对于每个产品和仓库),在本例中为 2020-11-30。

它应该看起来像这样:

REF  WAREHOUSE  UNITS   IN   OUT  MOVEMENT  CUMULATIVE   DATE   
1       1         3      0    3      -3        -3      2020-11-25
1       0         9      9    0       9         2      2020-11-26 
2       0         2      2    0       2         2      2020-11-26

对不起,如果我不清楚。问我是否需要澄清任何事情

谢谢

标签: sqlsql-server

解决方案


我猜你想要这样的东西:

select t.*
from (select m.*,
             sum(m.entran - m1.salen) over (partition by m.codart, m.codalm order by fecdoc) as cumulative,
             max(fecdoc) over (partition by m.codart, m.codalm) as max_fecdoc
      from MOVSTOCKS m
      where fecdoc < '2020-11-30'
     ) m
where fecdoc = max_fecdoc;

子查询使用窗口函数和过滤器计算截止日期之前的记录的累积库存量。codeart外部查询从/的组合中选择最近的记录codalm,这似乎是您识别产品的方式。


推荐阅读