我正在使用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")
答案 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)