By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE #sample (sku nvarchar(max),data_type nvarchar(max),value_type nvarchar(max),value float)
INSERT INTO #sample (sku,data_type,value_type,value)
VALUES
('sku1','forecast','units','100'),
('sku1','forecast','gross sales','40'),
('sku1','forecast','net sales','50'),
('sku1','forecast','gross profit','60'),
('sku1','actual','units','200'),
('sku1','actual','gross sales','80'),
('sku1','actual','net sales','30'),
('sku1','actual','gross profit','20');
8 rows affected
SELECT a.sku, a.value_type, a.value AS actual_value, f.value AS forecast_value, a.value - f.value AS diff
FROM #sample a
JOIN #sample f ON a.data_type = 'actual' AND
f.data_type = 'forecast' AND
a.sku = f.sku AND
a.value_type = f.value_type
sku | value_type | actual_value | forecast_value | diff |
---|---|---|---|---|
sku1 | gross profit | 20 | 60 | -40 |
sku1 | gross sales | 80 | 40 | 40 |
sku1 | net sales | 30 | 50 | -20 |
sku1 | units | 200 | 100 | 100 |