我需要一个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
有人可以帮忙吗?
答案 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;
那么,下面的表达式是做什么的:
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]
定义了如何在给定分区中排序行(这是您定义哪一行在另一行之前的方式)