根据变更日志创建“从/到”日期列

时间:2020-10-23 08:38:15

标签: sql sql-server pivot

我现在的情况简述: 我希望合并两个单独的日志文件,以便在另一个时间获取一个日志的值。

我有两个桌子

  1. 已进行价格调整
  2. 转换因子调整

为了计算给定的价格,在统一的UOM(度量单位)中,我们将转换因子用作乘数

例如1box(转换系数)* 200(价格)= 100pcs(转换系数)* 2(价格)

我们数据中的价格和转换因子两个字段都在日志上显示了类似的内容

     Date      Part_No   Supplier_Id   Old_Value   New_Value  
 ------------ --------- ------------- ----------- ----------- 
  11-09-2019   A         B                     1           5  
  19-09-2019   A         B                     5           1

由于可以在同一天进行多次更改,因此名为LOG_ID的列是唯一的整数

我希望将表转换为可以使用起始/结束日期连接在一起的东西

所以我想要的输出如下所示(请注意,第一行具有静态的From_Date,最后一行的当前日期为To_Date

  Part_No   Supplier_Id   From_Date     To_Date     Value  
 --------- ------------- ------------ ------------ ------- 
  A         B             01-03-2010   10-09-2019       1  
  A         B             11-09-2019   18-09-2019       5  
  A         B             19-09-2019   23-10-2020       1 

我认为需要将透视功能与循环结合使用,但是我无法完全弄清楚如何将两者结合起来以识别直到今天为止直到今天为止所做的更改。

2 个答案:

答案 0 :(得分:1)

根据先前对这个问题的回答,我走到了这么远

SELECT
    Part_No,
    Supplier_Id,
    Date AS From_Date,
    ISNULL(DATEADD(dd,-1,lead(Date) OVER (PARTITION BY Part_No, Supplier_Id ORDER BY Date)),Date) AS To_date,
    New_Value

FROM
    data_Table

这将导致以下输出

    Part_No     Supplier_Id   From_Date     To_date     New_Value  
 ------------- ------------- ------------ ------------ ----------- 
  1032515-001          5277   11-09-2019   18-09-2019           5  
  1032515-001          5277   19-09-2019   19-09-2019           1 

不幸的是,正如我最初的问题所解释的那样,这并不是我想要的。下表显示了我想要的输出:

  Part_No   Supplier_Id   From_Date     To_Date     Value  
 --------- ------------- ------------ ------------ ------- 
  A         B             01-03-2010   10-09-2019       1  
  A         B             11-09-2019   18-09-2019       5  
  A         B             19-09-2019   23-10-2020       1 

静态第一个from_date,当前日期作为动态最终to_date

答案 1 :(得分:0)

您需要利用UNPIVOT,然后利用LEAD功能来实现:

DECLARE @table table(dateval date,partno char(1), supplierid char(1),
old_value int, new_value int)

insert into @table 
values
  ('2019-09-11','A','B',1,5),  
  ('2019-09-19','A','B',5,1);

select partno, supplierid, dateval as From_Date, 
isnull(dateadd(dd,-1,lead(dateval) over  (partition by partno, supplierid order by dateval)),dateval) as To_date, val
from @table
unpivot 
(
val
for keyv in ([old_value],[new_value])
) as upvt
where keyv = 'old_value'

+--------+------------+------------+------------+-----+
| partno | supplierid | From_Date  |  To_date   | val |
+--------+------------+------------+------------+-----+
| A      | B          | 2019-09-11 | 2019-09-18 |   1 |
| A      | B          | 2019-09-19 | 2019-09-19 |   5 |
+--------+------------+------------+------------+-----+