我一直在查询一个数据库,其中包含已为某个特定公司付款的工人数据,该数据被称为网站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岁时支付的新工作人员身份。
答案 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
从这里开始,您可以从聚合开始,更改日期查询等等