If keeping those rows is important... This doesn't seem to beat it up too bad...
IF OBJECT_ID('tempdb..#address') IS NOT NULL
DROP TABLE #address;
CREATE TABLE #address (
address_id INT,
addr1 CHAR(30),
addr2 CHAR(30),
addr3 CHAR(30),
addr4 CHAR(30),
addr5 CHAR(30),
addr6 CHAR(30)
)
insert into #address values (1, '', '111 Main Street', '', 'Main City', 'CA', '92222')
insert into #address values (2, '', '', '', 'HB', 'CA', '92222')
insert into #address values (3, '', '', '', '', NULL, '')
insert into #address values (6, 'Blue', '', '', 'Costa Mesa', 'CA', '92222')
-- The actual solution --
SELECT
x.address_id,
MAX(CASE WHEN x.PartNum = 1 THEN NULLIF(x.PartName, '') END) AS Col1,
MAX(CASE WHEN x.PartNum = 2 THEN NULLIF(x.PartName, '') END) AS Col2,
MAX(CASE WHEN x.PartNum = 3 THEN NULLIF(x.PartName, '') END) AS Col3,
MAX(CASE WHEN x.PartNum = 4 THEN NULLIF(x.PartName, '') END) AS Col4,
MAX(CASE WHEN x.PartNum = 5 THEN NULLIF(x.PartName, '') END) AS Col5,
MAX(CASE WHEN x.PartNum = 6 THEN NULLIF(x.PartName, '') END) AS Col6
FROM (
SELECT
a.address_id,
ROW_NUMBER() OVER (PARTITION BY a.address_id ORDER BY p.PartNum) AS PartNum,
p.PartName
FROM
#address a
CROSS APPLY (
VALUES (1, a.addr1), (2, a.addr2), (3, a.addr3), (4, a.addr4), (5, a.addr5), (6, a.addr6)
) p (PartNum, PartName)
WHERE
p.PartName <> '' OR CONCAT(a.addr1, a.addr2, a.addr3, a.addr4, a.addr5, a.addr6) = ''
) x
GROUP BY
x.address_id
address_id Col1 Col2 Col3 Col4 Col5 Col6
----------- ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------
1 111 Main Street Main City CA 92222 NULL NULL
2 HB CA 92222 NULL NULL NULL
3 NULL NULL NULL NULL NULL NULL
6 Blue Costa Mesa CA 92222 NULL NULL