Тот факт, что у вас есть NULL в A и D, усложняет ситуацию для любых СУЩЕСТВ.
Любое решение MIN / MAX на C может не дать вам NULL, как я думаю, вы хотите. В противном случае используйте MIN (C) и простую группу по.
Сначала вы должны извлечь уникальные ключи (A, B, D), а затем использовать их, чтобы определить, извлекать строки снова и понять, что делать с C
DECLARE @TheTable TABLE (
A varchar(2) NULL,
B varchar(2) NULL,
C varchar(2) NULL,
D varchar(2) NULL
)
INSERT INTO @TheTable VALUES (NULL, 'd0', 'd0', NULL)
INSERT INTO @TheTable VALUES (NULL, 'd0', 'd1', NULL)
INSERT INTO @TheTable VALUES (NULL, 'd0', 'd2', 'a0')
INSERT INTO @TheTable VALUES ('d0', 'd1', 'd1', NULL)
INSERT INTO @TheTable VALUES ('d0', 'd2', 'd2', 'a0')
SELECT DISTINCT
T.A,
T.B,
CASE Number WHEN 1 THEN T.C ELSE NULL END,
T.D
FROM
(SELECT
COUNT(*) AS Number,
A, B, D
FROM
@TheTable
GROUP BY
A, B, D
) UQ
JOIN
@TheTable T ON ISNULL(T.A, '') = ISNULL(UQ.A, '') AND ISNULL(T.B, '') = ISNULL(UQ.B, '') AND ISNULL(T.D, '') = ISNULL(UQ.D, '')