Вы можете использовать комбинацию unpivot и GROUPING SETS. Не уверен, что вы используете ваш окончательный вывод, хотя
DECLARE @Salary TABLE
(
EmpCode INT NOT NULL,
BasicSalary INT NOT NULL,
HRA INT NOT NULL,
Conv INT NOT NULL
)
INSERT INTO @Salary (EmpCode,BasicSalary,HRA,Conv)
VALUES (1,10000,500,300),(2,10000,500,300);
SELECT CASE
WHEN GROUPING(CA1.ColName) = 1 AND GROUPING(S.EmpCode) = 1 THEN 'GrandTotal'
WHEN GROUPING(CA1.ColName) = 1 THEN 'Total'
ELSE CA1.ColName
END AS SalaryCode,
SUM(CA1.ColVal) - CASE --Adjust the sum to exclude the EmpCode values
WHEN GROUPING(CA1.ColName) = 1 AND GROUPING(S.EmpCode) = 1 THEN SUM(S.EmpCode) / 4
WHEN GROUPING(CA1.ColName) = 1 THEN S.EmpCode
ELSE 0
END AS SalaryDetails
FROM @Salary AS S
CROSS
APPLY (VALUES (CAST('BasicSalary' AS VARCHAR(50)),BasicSalary,2),('HRA',HRA,3),('Conv',Conv,4),('EmpCode',EmpCode,1)) AS CA1(ColName,ColVal,RowPos)
GROUP BY GROUPING SETS((),(EmpCode),(EmpCode,ColName,CA1.RowPos))
ORDER BY ISNULL(S.EmpCode,MAX(S.EmpCode) OVER ()+1), ISNULL(CA1.RowPos,MAX(CA1.RowPos) OVER()+1) ASC;
Редактировать
Выход был изменен в соответствии с OP. Чувствую, что этот уровень презентации здесь не подходит, но это должно быть по требованию. Так как EmpCode включен в список, необходимо внести некоторые коррективы, чтобы убедиться, что он не включен в итоги. Также значение позиции было добавлено к выводу в правильном порядке