SQL Server对列枢轴

时间:2018-11-14 15:11:09

标签: sql-server

  

我正在使用SQL Server2014。我需要以下报告。头名   是动态的,如果可以赚到HeadType,则可以是任何名称,然后显示   Tot_hrs和Amount,如果HeadType是扣除,则显示唯一   金额。

     

注意:请确保不要将HeadName数据硬编码在   进行查询,因为用户可以在.eg的收入和扣除中添加数据   假期工作OT,奖励,迟到扣除,贷款等

     

我将提供两个结果,即fromPayslipDate和ToPayslipDate结果   应该显示为下图。

fit_num_var <- lm(SalePrice ~ ResidentialUnits + CommercialUnits + 
              YearBuilt + TotalUnits + LandSquareFeet + GrossSquareFeet,
   data=clean_sales)
ggplot(fit_num_var, aes(x=fitted(fit_num_var), 
          y=residuals(fit_num_var)) + 
         geom_point() + smooth() + xlab("Fitted Values") + 
                                   ylab("Studentized Residuals")

enter image description here

1 个答案:

答案 0 :(得分:0)

我假设“ Earning” HeadType的HeadNames是静态的。如果是,以下脚本可以为您提供帮助。 (我还把EmployeeId覆盖了多个记录)

drop table #PaySlip;
drop table #PaySlipD;
CREATE TABLE #PaySlip (PaySlipID int, SlipNo varchar(50), SlipDate date, EmployeeID int, RatePerHrs numeric(18,2));
CREATE TABLE #PaySlipD (PaySlipID int,HeadType varchar(50),OrderNo int, HeadName varchar(50), Tot_hrs numeric(18,2), Amount numeric(18,2));


INSERT INTO #PaySlip
    (PaySlipID,SlipNo,SlipDate ,EmployeeID,RatePerHrs)
    values
    (3, '2018-0001',    '2018-10-03',   30, 7.00),
    (4, '2018-0002',    '2018-10-03',   23, 8.00);

INSERT INTO #PaySlipD
    (PaySlipID,HeadType,OrderNo,HeadName,Tot_hrs,Amount)
    values
(   3   ,   'Earning'   ,   2   ,   'Normal Hours'  ,   82  ,   574 ),
(   3   ,   'Earning'   ,   2   ,   'OT Normal'     ,   13.57   ,   0   ),
(   3   ,   'Earning'   ,   3   ,   'OT Holiday'    ,   0   ,   0   ),
(   3   ,   'Earning'   ,   5   ,   'Incentive'     ,   0   ,   0   ),
(   3   ,   'Deduction' ,   1   ,   'Loan'          ,   0   ,   0   ),
(   3   ,   'Deduction' ,   2   ,   'Tax'           ,   0   ,   26.13   ),
(   3   ,   'Deduction' ,   3   ,   'Employee NPF'  ,   0   ,   34.44   ),
(   3   ,   'Deduction' ,   4   ,   'Employer NPF'  ,   0   ,   48.22   ),
(   4   ,   'Earning'   ,   1   ,   'Normal Hours'  ,   71.24   ,   498.68  ),
(   4   ,   'Earning'   ,   2   ,   'OT Normal'     ,   4.85    ,   0   ),
(   4   ,   'Earning'   ,   3   ,   'OT Holiday'    ,   0   ,   0   ),
(   4   ,   'Earning'   ,   5   ,   'Incentive'     ,   0   ,   0   ),
(   4   ,   'Deduction' ,   1   ,   'Loan'          ,   0   ,   0   ),
(   4   ,   'Deduction' ,   2   ,   'Tax'           ,   0   ,   15.25   ),
(   4   ,   'Deduction' ,   3   ,   'Employee NPF'  ,   0   ,   29.92   ),
(   4   ,   'Deduction' ,   4   ,   'Employer NPF'  ,   0   ,   41.89   )

    DECLARE @ColumnsEarning     VARCHAR(MAX);
    DECLARE @ColumnsEarningWithHoursAlias       VARCHAR(MAX);
    DECLARE @ColumnsEarningWithAmountAlias      VARCHAR(MAX);
    DECLARE @ColumnsDeduction    VARCHAR(MAX);
    DECLARE @SQLString  VARCHAR(MAX);

    SET @ColumnsEarning=STUFF((SELECT distinct ',' + QUOTENAME(HeadName) 
                    from #PaySlipD  WHERE HeadType='Earning'
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'');

    --I put alias to understand which one related Hours which one Amount
        SET @ColumnsEarningWithHoursAlias=STUFF((SELECT distinct ',' + QUOTENAME(HeadName) +' '+QUOTENAME(HeadName+'_Hours')
                        from #PaySlipD  WHERE HeadType='Earning'
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'');

        SET @ColumnsEarningWithAmountAlias=REPLACE(@ColumnsEarningWithHoursAlias,'_Hours','_Amount')

    SET @ColumnsDeduction=STUFF((SELECT distinct ',' + QUOTENAME(HeadName) 
                    from #PaySlipD  WHERE HeadType='Deduction'
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'');
PRINT(@ColumnsEarning)
PRINT(@ColumnsEarningWithHoursAlias)
PRINT(@ColumnsEarningWithAmountAlias)


SET @SQLString='
SELECT * FROM #PaySlip P
LEFT JOIN 
    (
    SELECT PaySlipId,'+@ColumnsEarningWithHoursAlias+' FROM 
        ( SELECT T.PaySlipId,HeadName,Tot_hrs FROM #PaySlipD T
        WHERE HeadType=''Earning''
        ) S
        PIVOT
        (
          sum(Tot_hrs)
          for HeadName in ('+@ColumnsEarning+')
        ) AS EH
    ) AS EH ON P.PaySlipId=EH.PaySlipId
LEFT JOIN 
    (
    SELECT PaySlipId,'+@ColumnsEarningWithAmountAlias+' FROM 
        ( SELECT T.PaySlipId,HeadName,Amount FROM #PaySlipD T
        WHERE HeadType=''Earning''
        ) S
        PIVOT
        (
          sum(Amount)
          for HeadName in ('+@ColumnsEarning+')
        ) AS EA
    ) AS EA ON EH.PaySlipId = EA.PaySlipId
LEFT JOIN 
    (
    SELECT * FROM 
        ( SELECT T.PaySlipId,HeadName,Amount FROM #PaySlipD T
        WHERE HeadType=''Deduction''
        ) S
        PIVOT
        (
          sum(Amount)
          for HeadName in ('+@ColumnsDeduction+')
        ) AS D
    ) AS D ON EH.PaySlipId = D.PaySlipId

    ';

EXEC(@SQLString)