Удалите дублирующиеся значения при экспорте данных SQL в Excel, используя объединение двух таблиц в C # - PullRequest
0 голосов
/ 24 ноября 2018

Я должен объединить 2 таблицы со многими: многими.1 код изделия может содержать много кодов материала, и наоборот.

При выполнении запроса SQL результаты выводят все строки, которые совпадают с обеих сторон, например:

enter image description here

Но я не хочу иметь дублированные значения.

Мои желаемые результаты выглядят так:

enter image description here

Как получить такой результат?

Мой SQL-запросэто:

SELECT DISTINCT
    x._PROCESS_INST_NO,  
    x._GOODS_CD,
    x._QTY,
    y._GOODS_CD,
    Y._QTY
FROM 
    [TBL_PROC_PM] x
FULL OUTER JOIN 
    (SELECT  
         t._PROCESS_INST_NO,
         t._GOODS_CD,
         t._QTY
     FROM 
         [TBL_PROC_PMS] t) y ON y._PROCESS_INST_NO = x._PROCESS_INST_NO
WHERE 
    y._PROCESS_INST_NO IN ('631886', '635312')  

2 таблицы SQL:

SELECT [_PROCESS_INST_NO]     
      ,[_GOODS_CD]     
      ,[_QTY]    
  FROM [TBL_PROC_PM]
   where _PROCESS_INST_NO IN ('631886', '635312')  

enter image description here

SELECT [_PROCESS_INST_NO]     
      ,[_GOODS_CD]     
      ,[_QTY]    
  FROM [TBL_PROC_PMS]
   where _PROCESS_INST_NO IN ('631886', '635312') 

enter image description here

1 Ответ

0 голосов
/ 25 ноября 2018

Вы хотели, чтобы пустые значения возвращались в ячейки для последующих повторяющихся значений в столбцах, или вы хотите свернуть дублированные результаты?Если это последнее, вы можете попробовать это:

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.

enter image description here

Если, с другой стороны, выхотите пустые значения, может быть, что-то вроде этого может работать для вас:

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;

Это будет возвращать пустые значения (при условии, что типы данных поддерживают пустое значение)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...