在 TSQL 中,将行展平为两列(如偶数和奇数),几乎像枢轴,但按另一列分组

问题描述 投票:0回答:1

我有一种情况,我的数据是

#SourceData
表的格式,我需要将其转换为
#FinalData
表的格式,示例代码如下。

稍微口头解释一下,

RowNumber
表的
#SourceData
列是对日期进行排序的,按
TrackingNumber
列分组。
RowNumber
列中具有奇数的日期将进入
Date1
,偶数的日期将进入
Date2

看起来这可能是一个枢轴,但不完全是,它开始让我的大脑融化。 请注意,一个 TrackingNumber(不包括)有超过 100 个日期。

示例数据:

CREATE Table #SourceData (
 TrackingNumber int NULL
,Date1  date NULL
,Date2  date NULL
,RowNumber int NULL
);

INSERT INTO #SourceData
      SELECT 3   , '09/18/2016', NULL, 1
UNION SELECT 3   , '12/21/2016', NULL, 2
UNION SELECT 12  , '01/30/2018', NULL, 1
UNION SELECT 12  , '01/30/2018', NULL, 2
UNION SELECT 12  , '03/01/2019', NULL, 3
UNION SELECT 12  , '03/05/2019', NULL, 4
UNION SELECT 12  , '04/19/2020', NULL, 5
UNION SELECT 23  , '02/14/2017', NULL, 1
UNION SELECT 130 , '04/12/2017', NULL, 1
----------------------------------------
CREATE Table #FinalData (
     TrackingNumber int NULL
    ,Date1  date NULL
    ,Date2  date NULL
);

INSERT INTO #FinalData
      SELECT 3   , '09/18/2016', '12/21/2016'
UNION SELECT 12  , '01/30/2018', '01/30/2018'
UNION SELECT 12  , '03/01/2019', '03/05/2019'
UNION SELECT 12  , '04/19/2020', NULL
UNION SELECT 23  , '02/14/2017', NULL
UNION SELECT 130 , '04/12/2017', NULL
t-sql pivot
1个回答
0
投票

这符合我认为所需的输出:

select distinct
  TrackingNumber
, case when RowNumber % 2 > 0 then Date1
       else lag(date1,1) over(partition by TrackingNumber order by RowNumber)
  end as Date1
, case when RowNumber % 2 = 0 then Date1 
       else lead(date1,1) over(partition by TrackingNumber order by RowNumber)
       end as Date2
from #SourceData 
追踪号码 日期1 日期2
3 2016-09-18 2016-12-21
12 2018-01-30 2018-01-30
12 2019-03-01 2019-03-05
12 2020-04-19
23 2017-02-14
130 2017-04-12

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.