добавить дополнительную строку общей зарплаты - PullRequest
0 голосов
/ 31 октября 2018

salary таблица:

EmpCode BASIC   HRA  CONV
--------------------------
   1    10000   500  300
   2    10000   500  300

Желаемый вывод:

   SalaryCode   SalaryDetails
    EmpCode           1
    BASIC           10000
    HRA               500
    CONV              300
   Total            10800

    EmpCode           2
    BASIC           10000
    HRA               500
    CONV              300
   Total            10800
 Grand Total        21600

"Мне нравится показывать общий итог после empcode '2' общий "

я написал код для всего как

select SalaryCode, SalaryDetails from<br> (select ecode,BASIC,HRA,CONV,(BASIC+HRA+CONV)SUB_Total from empstb) a unpivot(SalaryDetails for SalaryCode in (ecode,BASIC,HRA,CONV,SUB_Total)) upvt

but i don't know how to add grand total to it

1 Ответ

0 голосов
/ 31 октября 2018

Вы можете использовать комбинацию 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 включен в список, необходимо внести некоторые коррективы, чтобы убедиться, что он не включен в итоги. Также значение позиции было добавлено к выводу в правильном порядке

...