Tsql SQL Server条件比较
我有两张桌子:Tsql SQL Server条件比较,tsql,compare,Tsql,Compare,我有两张桌子: CREATE TABLE #HOURS (DAY INTEGER, 小时整数 CREATE TABLE #PERSONS (DAY INTEGER, HOUR INTEGER, Name NVARCHAR(50)) GO INSERT #HOURS VALUES (1, 5) INSERT #HOURS VALUES (1, 6) INSERT #HOURS VALUES (1, 8) INSERT #HOURS VALUES (1, 10) INSERT #HOURS V
CREATE TABLE #HOURS
(DAY INTEGER,
小时整数
CREATE TABLE #PERSONS
(DAY INTEGER, HOUR INTEGER,
Name NVARCHAR(50))
GO
INSERT #HOURS VALUES (1, 5)
INSERT #HOURS VALUES (1, 6)
INSERT #HOURS VALUES (1, 8)
INSERT #HOURS VALUES (1, 10)
INSERT #HOURS VALUES (1, 14)
INSERT #HOURS VALUES (1, 15)
INSERT #HOURS VALUES (1, 16)
INSERT #HOURS VALUES (1, 17)
INSERT #HOURS VALUES (1, 18)
INSERT #PERSONS VALUES (1, 5, 'Steve')
INSERT #PERSONS VALUES (1, 6, 'Steve')
INSERT #PERSONS VALUES (1, 7, 'Steve')
INSERT #PERSONS VALUES (1, 8, 'Steve')
INSERT #PERSONS VALUES (1, 10, 'Steve')
INSERT #PERSONS VALUES (1, 14, 'Steve')
INSERT #PERSONS VALUES (1, 15, 'Steve')
INSERT #PERSONS VALUES (1, 16, 'Steve')
INSERT #PERSONS VALUES (1, 17, 'Steve')
INSERT #PERSONS VALUES (1, 10, 'Jim')
INSERT #PERSONS VALUES (1, 11, 'Jim')
INSERT #PERSONS VALUES (1, 12, 'Jim')
INSERT #PERSONS VALUES (1, 13, 'Jim')
GO
小时显示工作时间,人员显示按小时进入系统的人员。
我想找工作时间与工时表相符的人。但他或她可以跳过两个工作小时
我试过这个:
select t.Day, sum(t.Nulls)
from
(select h.Hour, h.Day
, Case
WHEN p.Hour is null Then 1 ELSE 0 END Nulls
from #HOURS h
left join #PERSONS P on h.Hour = p.Hour AND h.Day = p.Day) t
group by t.Day
HAVING sum(t.Nulls) < 2
但这只有在同一天没有不同的人时才有效
有什么建议吗?我想你还需要进一步澄清一下你对结果的期望。同时,这能让你开始吗
SELECT p.DAY, p.Name, WORKED = COUNT(*), WORKHOURS = AVG(hc.WORKHOURS)
FROM #PERSONS p
INNER JOIN #HOURS h ON h.DAY = p.DAY AND h.HOUR = p.HOUR
LEFT OUTER JOIN (
SELECT DAY, WORKHOURS = COUNT(*)
FROM #HOURS
GROUP BY DAY
) hc ON hc.DAY = p.DAY
GROUP BY p.DAY, p.Name
我认为你的意思是,对于每一天和每一个人的组合,如果该人在该天工作的有效小时数在该天存在的有效小时数的2小时之内,你想要返回它。如果是这样,这应该可以做到:
SELECT
Day
, Name
, HoursWorked
, HoursInDay
FROM (
SELECT
p.Day
, p.Name
, COUNT(*) HoursWorked
, (SELECT COUNT(*) FROM #Hours H2 WHERE H2.Day = P.Day) HoursInDay
FROM
#Persons P INNER JOIN #Hours H
ON P.Day = H.Day And P.Hour = H.Hour
GROUP BY
p.Day, p.Name
) Data
WHERE
HoursWorked + 2 >= HoursInDay
那你想找什么?那些跳过超过2个工作小时的人?我已经修改了我的问题。我不是在找船长。这是一种匹配。匹配记录,但有一个灵活性,你可以错过两个记录。我试图避免使用总工作时间一天。我不知道为什么;很好用,非常感谢。