Sql server 添加额外的工资总额行

Sql server 添加额外的工资总额行,sql-server,unpivot,Sql Server,Unpivot,工资表: 期望输出: SalaryCode SalaryDetails EmpCode 1 BASIC 10000 HRA 500 CONV 300 Total 10800 EmpCode 2 BASIC 10000 HRA 500

工资表:

期望输出:

   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
我喜欢在EMP代码“2”后显示总计 总数

我写的代码总数为

选择SalaryCode,SalaryDetails 从…起 从empstb a中选择ecode、BASIC、HRA、CONV、BASIC+HRA+CONVSUB_总计 在ecode、BASIC、HRA、CONV、upvt小计中取消工资代码的工资明细


但我不知道如何将总计添加到它中

您可以使用unpivot和分组集的组合。但不确定您使用最终输出的目的是什么

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进行了调整。确实觉得这个级别的演示不属于这里,但这应该是需要的。由于EMP代码包含在列表中,因此必须进行一些调整,以确保其不包含在总数中。此外,位置值已按正确顺序添加到输出中

,但我需要在“SalaryCode”中获取“EmpCode”,“SalaryDetails”列不仅作为输出中的单独列,而且“HRA”行也不符合例外输出的顺序
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;