• Using the sample data DDL Bert generously supplied, here's an alternative that reads the base table 1 time instead of 6:

    SELECT Col1,
       Col2=CASE WHEN GROUPING(Col2)=1 THEN 'Diff' ELSE Col2 END,
       Col3=CASE WHEN GROUPING(Col2)=1 THEN SUM(CASE WHEN Col2='before' THEN Col3 ELSE 0 END)-SUM(CASE WHEN Col2='after' THEN Col3 ELSE 0 END) ELSE SUM(Col3) END
    FROM @Table
    GROUP BY GROUPING SETS ((Col1,Col2),(Col1))
    ORDER BY Col1,CASE WHEN Col2='before' THEN 0 WHEN Col2='After' THEN 1 ELSE 2 END;

    Cheers!