比较历史行(LAG 行)并将更改的值合并到单列

哈尔萨尔

比较历史行(基于 ResultChngDt 的 LAG 行)并将更改的列值合并为单列。寻求帮助编写优雅/高效的 SQL Server 2016 TSQL 代码(无游标)。

我有一个结构和数据如下的表:

+----+-------+--------------+---------------+--------+--------+--------------+
| ID | RepID | CollctedDate | CompletedDate | Result | Tcode  | ResultChngDt |
+----+-------+--------------+---------------+--------+--------+--------------+
| 1  | 101   | 11/20/2017   | 12/13/2017    |        | L-2190 | 12/13/2017   |
| 1  | 101   | 11/22/2017   | 12/15/2017    | POS    | L-Afb  | 1/5/2018     |
| 1  | 102   | 11/22/2017   | 12/15/2017    |        | L-2191 | 12/15/2017   |
| 1  | 102   | 11/22/2017   | 12/15/2017    | POS    | L-2192 | 12/31/2017   |
+----+-------+--------------+---------------+--------+--------+--------------+

我需要生成一个报告/结果如下:

+----+-------+---------------------------+--------------------------+--+
| ID | RepID | Previous                  | Current                  |  |
+----+-------+---------------------------+--------------------------+--+
| 1  | 101   | CollctedDate:11/20/2017   | CollctedDate:11/22/2017  |  |
|    |       | CompletedDate:12/13/2017  | CompletedDate:12/15/2017 |  |
|    |       | Result:                   | Result:POS               |  |
|    |       | Tcode:L-2190              | Tcode:L-Afb              |  |
| 1  | 102   | CollctedDate:11/22/2017   | CollctedDate:11/22/2017  |  |
|    |       | CompletedDate:12/15/2017  | CompletedDate:12/15/2017 |  |
|    |       | Result:                   | Result:POS               |  |
|    |       | Tcode:L-2191              | Tcode:L-2192             |  |
+----+-------+---------------------------+--------------------------+--+

CREATE TABLE [dbo].[Table1]
    (
        [ID]            INT         NULL,
        [RepID]         INT         NULL,
        [CollctedDate]  DATETIME    NULL,
        [CompletedDate] DATETIME    NULL,
        [Result]        VARCHAR(3)  NULL,
        [Tcode]         VARCHAR(10) NULL,
        [ResultChngDt]  DATETIME    NULL
    ) ON [PRIMARY];
GO

INSERT INTO [dbo].[Table1] ([ID], [RepID], [CollctedDate], [CompletedDate], [Result], [Tcode], [ResultChngDt])
 VALUES (1, 101, N'11/20/2017', N'12/13/2017', N'', N'L-2190', N'12/13/2017') 
, (1, 101, N'11/22/2017', N'12/15/2017', N'POS', N'L-Afb', N'1/5/2018') 
, (1, 102, N'11/22/2017', N'12/15/2017', N'', N'L-2191', N'12/15/2017') 
, (1, 102, N'11/22/2017', N'12/15/2017', N'POS', N'L-2192', N'12/31/2017') 
光环

这是我对您的问题的查询:

    WITH cte_LEADLAG AS(
    SELECT ID,
           RepID,
           CollctedDate,
           CompletedDate,
           Result,
           Tcode,
           ResultChngDt,
           CONCAT('CollectedDate:',CAST(CollctedDate AS DATETIME2), ' CompletedDate:', CAST(CompletedDate AS DATETIME2), ' Result:', Result, ' Tcode', Tcode) AS dates,
           LAG(CollctedDate) OVER(PARTITION BY RepID ORDER BY CollctedDate) AS 'LAGCollectedDate'  ,
           lead(CollctedDate) OVER(PARTITION BY RepID ORDER BY CollctedDate) AS 'LEADCollectedDate',
           LAG(CompletedDate) OVER(PARTITION BY RepID ORDER BY CompletedDate) AS 'LAGCompDate'  ,
           lead(CompletedDate) OVER(PARTITION BY RepID ORDER BY CompletedDate) AS 'LEADcompDate' ,
           LEAD(Result) OVER(PARTITION BY RepID ORDER BY CompletedDate) AS 'LEADResult' ,
           LEAD(Tcode) OVER(PARTITION BY RepID ORDER BY CompletedDate) AS 'LEADTcode'    
    FROM #temp
    ),
     cte_FINAL AS(
    SELECT distinct ID,
                    RepID,
                    CASE WHEN cte.LAGCollectedDate IS NULL THEN CONCAT('CollectedDate:',CAST(CollctedDate AS DATETIME2), ' CompletedDate:', CAST(CompletedDate AS DATETIME2), ' Result:', Result, ' Tcode', Tcode) end AS 'Previous',
                    CASE WHEN cte.LEADCollectedDate IS not NULL THEN  CONCAT('CollectedDate:',CAST(cte.LEADCollectedDate AS DATETIME2), ' CompletedDate:', CAST(LEADcompDate AS DATETIME2), ' Result:', cte.LEADResult, ' Tcode', cte.LEADTcode) end AS 'Current'
    FROM cte_LEADLAG AS cte
    WHERE cte.LEADCollectedDate IN (SELECT MAX(LEADCollectedDate) FROM cte_LEADLAG WHERE cte_LEADLAG.RepID = cte.RepID))
)
    SELECT *
    FROM cte_FINAL;

结果:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将行值合并到列

来自分类Dev

在数据框中查找包含一对公共值的行,并将它们合并到第三列

来自分类Dev

如何循环合并多个行中的单列值

来自分类Dev

SQL使用联接并将两行从一个联接合并到一行,并在不同列中使用值

来自分类Dev

将多个行值合并到单个列中

来自分类Dev

如何将这三个订单列表合并到一个具有相同名称项的列表合并到一行?

来自分类Dev

通过将不同的行值合并到单个列中来合并多行

来自分类Dev

通过将不同的行值合并到单个列中来合并多行

来自分类Dev

如何将多个行中的值合并到Excel中的单个行中?

来自分类Dev

比较列表并将其合并到表中

来自分类Dev

如何根据唯一的行值将列值合并到向量列中?

来自分类Dev

SQL根据行分组列表迭代(循环)查询,并将每次迭代的结果合并到同一表中

来自分类Dev

如何将唯一的行值合并到多个列中的单个列中?

来自分类Dev

将行合并到一个具有值的ID

来自分类Dev

将三行的输出合并到sql中的单个值

来自分类Dev

将多个值合并到一个新列中的一行 Pandas Python

来自分类Dev

将某些列的值和列名的所有组合合并到一行中

来自分类Dev

如何将具有特定值的行合并到 R 中的表中?

来自分类Dev

将行合并到单个记录

来自分类Dev

oracle查询合并到一行

来自分类Dev

合并两个行值并将行值旋转到列标题中

来自分类Dev

awk 找到两个文件的公共行并将这些行合并到第三个文件中的一行

来自分类Dev

如何将两个值(行)合并到具有自定义值的单行中?

来自分类Dev

比较单列中的行值,并相应地更新SQL-Server表中的标志

来自分类Dev

识别data.frame的多个子集中的大多数可变行,并将此信息合并到最终的data.frame中

来自分类Dev

从另一台服务器获取另一张表的行详细信息,并将其合并到您的查询中

来自分类Dev

比较两个List <T>并将其合并到新的List <T>中

来自分类Dev

熊猫 按字段分组并将值合并为一行

来自分类Dev

使用jq循环遍历json以获取多个值并将其合并为一行

Related 相关文章

  1. 1

    将行值合并到列

  2. 2

    在数据框中查找包含一对公共值的行,并将它们合并到第三列

  3. 3

    如何循环合并多个行中的单列值

  4. 4

    SQL使用联接并将两行从一个联接合并到一行,并在不同列中使用值

  5. 5

    将多个行值合并到单个列中

  6. 6

    如何将这三个订单列表合并到一个具有相同名称项的列表合并到一行?

  7. 7

    通过将不同的行值合并到单个列中来合并多行

  8. 8

    通过将不同的行值合并到单个列中来合并多行

  9. 9

    如何将多个行中的值合并到Excel中的单个行中?

  10. 10

    比较列表并将其合并到表中

  11. 11

    如何根据唯一的行值将列值合并到向量列中?

  12. 12

    SQL根据行分组列表迭代(循环)查询,并将每次迭代的结果合并到同一表中

  13. 13

    如何将唯一的行值合并到多个列中的单个列中?

  14. 14

    将行合并到一个具有值的ID

  15. 15

    将三行的输出合并到sql中的单个值

  16. 16

    将多个值合并到一个新列中的一行 Pandas Python

  17. 17

    将某些列的值和列名的所有组合合并到一行中

  18. 18

    如何将具有特定值的行合并到 R 中的表中?

  19. 19

    将行合并到单个记录

  20. 20

    oracle查询合并到一行

  21. 21

    合并两个行值并将行值旋转到列标题中

  22. 22

    awk 找到两个文件的公共行并将这些行合并到第三个文件中的一行

  23. 23

    如何将两个值(行)合并到具有自定义值的单行中?

  24. 24

    比较单列中的行值,并相应地更新SQL-Server表中的标志

  25. 25

    识别data.frame的多个子集中的大多数可变行,并将此信息合并到最终的data.frame中

  26. 26

    从另一台服务器获取另一张表的行详细信息,并将其合并到您的查询中

  27. 27

    比较两个List <T>并将其合并到新的List <T>中

  28. 28

    熊猫 按字段分组并将值合并为一行

  29. 29

    使用jq循环遍历json以获取多个值并将其合并为一行

热门标签

归档