Hi @Nethan ,
Here is a solution based on the STRING_AGG() function. It requires SQL Server 2017 and later.
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (id int, name varchar(10), Addr1 varchar(50), Addr2 varchar(50), state char(2), zip char(5));
INSERT INTO @tbl VALUES
( 1 ,'Tom', null, 'xyz', 'OH',NULL)
,(1, 'Tom', 'zxy', 'xyz', NULL,NULL)
,(1, 'Tom', NULL, NULL, NULL,'28764')
,( 2 ,'Bill', null, 'xyz', 'AZ',NULL)
,(2, 'Bill', 'zxy', 'xyz', NULL,NULL)
,(3, 'Kate', 'zxy', 'xyz', NULL,NULL);
-- DDL and sample data population, end
SELECT * FROM @tbl;
;WITH rs AS
(
SELECT id, name
, STRING_AGG(CONVERT(NVARCHAR(max), Addr1), ',') AS Addr1List
, STRING_AGG(CONVERT(NVARCHAR(max), Addr2), ',') AS Addr2List
, STRING_AGG(CONVERT(NVARCHAR(max), state), ',') AS stateList
, STRING_AGG(CONVERT(NVARCHAR(max), zip), ',') AS zipList
FROM @tbl
GROUP BY id, name
)
SELECT ID, name
, LEFT(Addr1List, IIF(CHARINDEX(',', Addr1List) > 0, CHARINDEX(',', Addr1List) - 1,LEN(Addr1List))) AS Addr1
, LEFT(Addr2List, IIF(CHARINDEX(',', Addr2List) > 0, CHARINDEX(',', Addr2List) - 1,LEN(Addr2List))) AS Addr2
, LEFT(stateList, IIF(CHARINDEX(',', stateList) > 0, CHARINDEX(',', stateList) - 1,LEN(stateList))) AS state
, LEFT(zipList, IIF(CHARINDEX(',', zipList) > 0, CHARINDEX(',', zipList) - 1,LEN(zipList))) AS zip
FROM rs
ORDER BY ID;
Output
+----+------+-------+-------+-------+-------+
| ID | name | Addr1 | Addr2 | state | zip |
+----+------+-------+-------+-------+-------+
| 1 | Tom | zxy | xyz | OH | 28764 |
| 2 | Bill | zxy | xyz | AZ | NULL |
| 3 | Kate | zxy | xyz | NULL | NULL |
+----+------+-------+-------+-------+-------+