与使用工人ID的以前的工人相比,计算出新工人的工资

时间:2018-01-03 09:08:17

标签: sql tsql

我一直在查询一个数据库,其中包含已为某个特定公司付款的工人数据,该数据被称为网站ID。但是,我想从指定的日期,当天工作的总小时数和当天支付的工人总数中获取每天的日期。这适用于以下查询。但是,日期从2017年9月25日开始。支付的工人总数是122.但是我想查询一下,这将告诉我在26日已经支付了多少新工人,这些工人在25日没有支付,然后在27日支付相同的费用。到目前为止已完成的代码如下:

USE database

GO



IF OBJECT_ID('tempdb..#ts') IS NOT NULL
    DROP TABLE #ts

SELECT
    ts.[IsAdjustment],
    ts.[DateFrom],
    ts.[Id] AS [TsId],
    tl.*
INTO #ts
FROM
            [Timesheet]     ts
INNER JOIN  [TimesheetLine] tl  ON  ts.[Id] = tl.[TimesheetId]
WHERE
    ts.[SiteId] = 901

IF OBJECT_ID('tempdb..#tsl') IS NOT NULL
    DROP TABLE #tsl

CREATE TABLE #tsl (
    [WorkerId] INT,
    [DateFrom] DATE,
    [DateWorked] DATE,
    [WorkUnitId] INT,
    [EntryGroupId] INT,
    [Hours] DECIMAL(10,2)
)

INSERT INTO #tsl SELECT [WorkerId], [DateFrom], DATEADD(day, 0, [DateFrom]), [WorkUnitId], [EntryGroupId], [Day1_Standard_hours] FROM #ts WHERE ISNULL([Day1_standard_hours], 0) <> 0
INSERT INTO #tsl SELECT [WorkerId], [DateFrom], DATEADD(day, 1, [DateFrom]), [WorkUnitId], [EntryGroupId], [Day2_Standard_hours] FROM #ts WHERE ISNULL([Day2_standard_hours], 0) <> 0
INSERT INTO #tsl SELECT [WorkerId], [DateFrom], DATEADD(day, 2, [DateFrom]), [WorkUnitId], [EntryGroupId], [Day3_Standard_hours] FROM #ts WHERE ISNULL([Day3_standard_hours], 0) <> 0
INSERT INTO #tsl SELECT [WorkerId], [DateFrom], DATEADD(day, 3, [DateFrom]), [WorkUnitId], [EntryGroupId], [Day4_Standard_hours] FROM #ts WHERE ISNULL([Day4_standard_hours], 0) <> 0
INSERT INTO #tsl SELECT [WorkerId], [DateFrom], DATEADD(day, 4, [DateFrom]), [WorkUnitId], [EntryGroupId], [Day5_Standard_hours] FROM #ts WHERE ISNULL([Day5_standard_hours], 0) <> 0
INSERT INTO #tsl SELECT [WorkerId], [DateFrom], DATEADD(day, 5, [DateFrom]), [WorkUnitId], [EntryGroupId], [Day6_Standard_hours] FROM #ts WHERE ISNULL([Day6_standard_hours], 0) <> 0
INSERT INTO #tsl SELECT [WorkerId], [DateFrom], DATEADD(day, 6, [DateFrom]), [WorkUnitId], [EntryGroupId], [Day7_Standard_hours] FROM #ts WHERE ISNULL([Day7_standard_hours], 0) <> 0

INSERT INTO #tsl SELECT [WorkerId], [DateFrom], DATEADD(day, 0, [DateFrom]), [WorkUnitId], [EntryGroupId], [Day1_Overtime_hours] FROM #ts WHERE ISNULL([Day1_Overtime_hours], 0) <> 0
INSERT INTO #tsl SELECT [WorkerId], [DateFrom], DATEADD(day, 1, [DateFrom]), [WorkUnitId], [EntryGroupId], [Day2_Overtime_hours] FROM #ts WHERE ISNULL([Day2_Overtime_hours], 0) <> 0
INSERT INTO #tsl SELECT [WorkerId], [DateFrom], DATEADD(day, 2, [DateFrom]), [WorkUnitId], [EntryGroupId], [Day3_Overtime_hours] FROM #ts WHERE ISNULL([Day3_Overtime_hours], 0) <> 0
INSERT INTO #tsl SELECT [WorkerId], [DateFrom], DATEADD(day, 3, [DateFrom]), [WorkUnitId], [EntryGroupId], [Day4_Overtime_hours] FROM #ts WHERE ISNULL([Day4_Overtime_hours], 0) <> 0
INSERT INTO #tsl SELECT [WorkerId], [DateFrom], DATEADD(day, 4, [DateFrom]), [WorkUnitId], [EntryGroupId], [Day5_Overtime_hours] FROM #ts WHERE ISNULL([Day5_Overtime_hours], 0) <> 0
INSERT INTO #tsl SELECT [WorkerId], [DateFrom], DATEADD(day, 5, [DateFrom]), [WorkUnitId], [EntryGroupId], [Day6_Overtime_hours] FROM #ts WHERE ISNULL([Day6_Overtime_hours], 0) <> 0
INSERT INTO #tsl SELECT [WorkerId], [DateFrom], DATEADD(day, 6, [DateFrom]), [WorkUnitId], [EntryGroupId], [Day7_Overtime_hours] FROM #ts WHERE ISNULL([Day7_Overtime_hours], 0) <> 0

DELETE FROM #tsl WHERE [DateWorked] < '2017-09-25' OR [DateWorked] > '2017-12-31'


-- ****************************************************************

SELECT
    CONVERT(VARCHAR(10), d.[DateWorked], 103) AS [DateWorked],
    SUM(d.[Hours]) AS [Total_Hours],
    COUNT([Workerid]) AS [PRN_Paid]
FROM
(SELECT
    [WorkerId],
    [DateFrom],
    [DateWorked],
    SUM([Hours]) AS [Hours] 
FROM 
    #tsl
GROUP BY

    [WorkerId],
    [DateFrom],
    [DateWorked]) d INNER JOIN [Worker] w ON d.[WorkerId] = w.[Id]

GROUP BY [DateWorked]
ORDER BY CONVERT(DATE, DateWorked) ASC

预期结果

DateWorked  Total_Hours PRN_Paid    New_PRN_Paid
25/09/2017   1376.94     122            0
26/09/2017   1403.40     126            12
27/09/2017   1477.25     136            16
28/09/2017   1432.10     133            3
29/09/2017   1305.49     123            1

因此,在第29届之前,任何一名支付工人的工作人员都不存在工作人员身份,即29岁时支付的新工作人员身份。

1 个答案:

答案 0 :(得分:0)

  

但是我想查询一下,这会告诉我在26日已经支付了多少新员工,而这些员工在25日没有支付

好的,在最基本的表单中,您需要where not exists

select *
from #ts1 x1
where dateworked between '2017-09-25' and '2017-09-29'
and not exists (select 1 
                from #ts1 x2 
                where x1.WorkerId = x2.WorkerId 
                and x2.dateworked < x1.dateworked) -- This excludes workers who worked on an earlier day

从这里开始,您可以从聚合开始,更改日期查询等等