Вы хотели, чтобы пустые значения возвращались в ячейки для последующих повторяющихся значений в столбцах, или вы хотите свернуть дублированные результаты?Если это последнее, вы можете попробовать это:
SELECT
x._PROCESS_INST_NO,
x._GOODS_CD,
SUM(x._QTY) AS [SUM_PM_QTY],
STUFF ((
SELECT ', ' + _GOODS_CD
FROM @TBL_PROC_PMS t2
WHERE t2._PROCESS_INST_NO = x._PROCESS_INST_NO
FOR XML PATH('')), 1, 1, ''
) AS [PMS_GOODS_CDS],
SUM(y._QTY) AS [SUM_PMS_QTY]
FROM @TBL_PROC_PM AS x
JOIN @TBL_PROC_PMS AS y ON y._PROCESS_INST_NO = x._PROCESS_INST_NO
GROUP BY x._PROCESS_INST_NO, x._GOODS_CD;
Это удалит дубликаты, сгруппировав их.Я также сгруппировал / объединил для вас значения cd товаров pms с синтаксисом STUFF ... FOR XML PATH
.
Если, с другой стороны, выхотите пустые значения, может быть, что-то вроде этого может работать для вас:
WITH cte AS --(PM_PROCESS_INST_NO, PM_GOODS_CD, PM_QTY, PMS_GOODS_CD, PMS_QTY)
(
SELECT
o._PROCESS_INST_NO AS PM_PROCESS_INST_NO,
o._GOODS_CD AS PM_GOODS_CD,
o._QTY AS PM_QTY,
f._GOODS_CD AS PMS_GOODS_CD,
f._QTY AS PMS_QTY,
ROW_NUMBER() OVER (PARTITION BY o._PROCESS_INST_NO ORDER BY o._PROCESS_INST_NO) AS GRP_PROCESS_INST_NO,
ROW_NUMBER() OVER (PARTITION BY o._GOODS_CD ORDER BY o._GOODS_CD) AS GRP_GOODS_CD,
ROW_NUMBER() OVER (PARTITION BY o._QTY ORDER BY o._QTY) AS GRP_QTY
FROM @TBL_PROC_PM o
JOIN @TBL_PROC_PMS f ON f._PROCESS_INST_NO = o._PROCESS_INST_NO
)
SELECT
CASE WHEN GRP_PROCESS_INST_NO = 1 THEN cte.PM_PROCESS_INST_NO ELSE '' END AS PM_PROCESS_INST_NO,
CASE WHEN GRP_GOODS_CD = 1 THEN cte.PM_GOODS_CD ELSE '' END AS PM_GOODS_CD,
CASE WHEN GRP_QTY = 1 THEN cte.PM_QTY ELSE '' END AS PM_QTY,
cte.PMS_GOODS_CD,
cte.PMS_QTY
FROM cte;
Это будет возвращать пустые значения (при условии, что типы данных поддерживают пустое значение)