合并sql 2014中的特定列值

时间:2015-12-08 07:18:48

标签: sql sql-server

我需要一个SQL查询来合并两行。 我创建了一个视图,输出如下:

PDesc       PrjCode PCode   A_No    A_Qty   B_No    B_Qty   C_No   C_Qty
KPPPPPPP    14-0123 6519    1090    58      NULL    NULL    NULL   NULL
Head SS ST4 14-0123 4322    1090    354960  741     354960  592    350000
Head SS ST4 14-0123 4322    1090    354960  741     354960  771    4960
XXXXXXX     14-0123 5668    1090    408     741     408     592   408    

我需要合并具有相同qyt的行,但是其他列应该以单独的行显示: 这里如果A_No相同则只显示一个A_Qty,如果B_No重复一个B_Qty就足够了,所以不应重复,

PDesc       PrjCode PCode   A_No    A_Qty   B_No    B_Qty   C_No   C_Qty
KPPPPPPP    14-0123 6519    1090    58      NULL    NULL    NULL   NULL
Head SS ST4 14-0123 4322    1090    354960  741     354960  592    350000
Head SS ST4 14-0123 4322    1090            741             771    4960
XXXXXXX     14-0123 5668    1090    408     741     408     592   408    

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您可以使用LAG功能访问上一行值。然后简单地说,如果前一行值与当前行值相同,则返回NULL - 如果不是,则返回当前行值。当然,您需要以特定方式对行进行排序。

例如:

DECLARE @DataSource TABLE
(
    [PDesc] VARCHAR(16)
   ,[PrjCode] CHAR(7)
   ,[PCode] CHAR(4)
   ,[A_No]  CHAR(4)
   ,[A_Qty] INT
   ,[B_No] INT
   ,[B_Qty] INT
   ,[C_No] INT 
   ,[C_Qty] INT
);

INSERT INTO @DataSource ([PDesc], [PrjCode], [PCode], [A_No], [A_Qty], [B_No], [B_Qty], [C_No], [C_Qty])
VALUES ('KPPPPPPP', '14-0123', '6519', '1090', '58', NULL, NULL, NULL, NULL)
      ,('Head SS ST4', '14-0123', '4322', '1090', '354960', '741', '354960', '592', '350000')
      ,('Head SS ST4', '14-0123', '4322', '1090', '354960', '741', '354960', '771', '4960')
      ,('XXXXXXX', '14-0123', '5668', '1090', '408', '741', '408', '592', '408');

SELECT [PDesc]
      ,[PrjCode]
      ,[PCode]
      ,[A_No]
      ,IIF(LAG([A_Qty], 1, NULL) OVER (PARTITION BY [PDesc], [PrjCode] ORDER BY [C_No]) = [A_Qty], NULL, [A_Qty]) AS [A_Qty]
      ,[B_No]
      ,IIF(LAG([B_Qty], 1, NULL) OVER (PARTITION BY [PDesc], [PrjCode] ORDER BY [B_Qty]) = [B_Qty], NULL, [B_Qty]) AS [B_Qty]
      ,[C_No]
      ,[C_Qty]
FROM @DataSource;

enter image description here

那么,下面的表达式是做什么的:

LAG([A_Qty], 1, NULL) OVER (PARTITION BY [PDesc], [PrjCode] ORDER BY [C_No])
  • LAG([A_Qty], 1, NULL)表示给我前一行的值 [A_Qty]
  • PARTITION BY [PDesc], [PrjCode]表示我们只在[PDesc], [PrjCode]对值相同的位置排序行。如果你不需要它,你可以跳过它。
  • ORDER BY [C_No]定义了如何在给定分区中排序行(这是您定义哪一行在另一行之前的方式)