简体   繁体   中英

Remove duplicated values when exporting SQL datatable to excel by using joining 2 tables in C#

I have to join 2 tables with a many:many relationship. 1 item code can contain many material codes, and vice versa.

When executing the SQL query, the results output all rows that match from both sides like this:

在此处输入图片说明

But I do not want to have the duplicated values.

My desired results look like:

在此处输入图片说明

How to get the result like this?

My SQL query is:

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 tables:

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

在此处输入图片说明

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

在此处输入图片说明

Did you want blank values returned in the cells for subsequent duplicate values in the columns or do you want to collapse the duplicate results? If it is the latter, you can try this:

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;

That will remove the duplicates by grouping them. I've also group collated/concatenated the pms goods cd values for you with the STUFF ... FOR XML PATH syntax.

在此处输入图片说明

If, on the other hand you want blank values, maybe something like this could work for you:

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;

That will return blank values (given that the data types support a blank value)

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM