Это просто DISTINCT
список значений position
и [Group]
& subgroup
с LEFT JOIN
возвращением в таблицу.
Выполнение 2 DISTINCT
запросов будет дорого, поэтому, если у вас есть таблица ваших групп и должностей, я бы предложил использовать их, а не CTE:
WITH Groups AS
(SELECT DISTINCT
[group],
subgroup
FROM dbo.YourTable),
Positions AS
(SELECT DISTINCT
position
FROM dbo.YourTable)
SELECT G.[Group],
G.subgroup,
P.Position,
YT.[value]
FROM Groups G
CROSS JOIN Positions P
LEFT JOIN dbo.YourTable YT ON G.[Group] = YT.[Group]
AND G.subgroup = YT.subgroup
AND P.Position = YT.Position;