Merge One SQL Column with a Delimiter While Selecting Others

A colleague posed a question, and I thought I’d post the answer here in case I needed to find it in the future, or others needed something like it. I found similar examples on the internet, but not quite like this, where a table needed to be filtered and ordered for the column that was merged, while listing other columns from the initial table. If the subquery filtering for tax returns blank or nothing, still return ‘SALES TAX’. Combine them with a slash. Here is the result using a memory table.

-- Create the memory table
DECLARE @PJInvDet TABLE (
  draft_num varchar(10),
  acct varchar(15),
  li_type varchar(1)
)

-- Provide sample data
INSERT @PJInvDet VALUES ('01', 'SALES TAX', 'T')
INSERT @PJInvDet VALUES ('01', 'NMGRT', 'T')
INSERT @PJInvDet VALUES ('02', 'SALES TAX', 'T')
INSERT @PJInvDet VALUES ('03', 'NMGRT', 'T')
INSERT @PJInvDet VALUES ('04', '', 'T')
INSERT @PJInvDet VALUES ('05', 'NOTHING FOUND', 'X')

-- Query the data
SELECT T.draft_num, tax_list = 
  COALESCE( -- This covers draft_num 05, where the subquery returns null.
    SUBSTRING(
      (SELECT '/' + 
        CASE 
          WHEN LEN(acct) = 0 
          THEN 'SALES TAX' 
          ELSE acct 
          END -- This covers draft_num 04, where the acct is blank.
    FROM @PJInvDet
    WHERE draft_num = T.draft_num
    AND li_type = 'T'
    GROUP BY acct
    ORDER BY acct DESC
    FOR XML PATH('')), 2, 20000),
    'SALES TAX') 
FROM @PJInvDet T
GROUP BY T.draft_num

Here’s the output:

draft_num  tax_list
01                 SALES TAX/NMGRT
02                 SALES TAX
03                 NMGRT
04                 SALES TAX
05                 SALES TAX

Thanks to Pinal Dave of the SQL Authority for the idea to use XML Path.

Leave a Reply

16 − 8 =