SQL Server 条件比较

发布于 2024-08-20 00:26:56 字数 1384 浏览 2 评论 0原文

我有两个表:

CREATE TABLE #HOURS
(DAY INTEGER,

HOUR 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

Hours 显示工作时间,#Persons 显示按小时进入系统的人员。 我想找到工作时间与工作时间表相符的人。但他或她可以跳过两个工作时间。

我已经尝试过:

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

但这仅在同一天没有不同的人时才有效;)

有什么建议吗?

I have two tables:

CREATE TABLE #HOURS
(DAY INTEGER,

HOUR 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

Hours shows the work hours and #Persons shows the persons that entered the system on hourly base.
I'd like to find the persons whose work hours matches the hours table. But he or she can skip two work hours.

I've tried this:

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

But this only works when there is not different persons on the same day ;)

Any suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

澜川若宁 2024-08-27 00:26:56

我认为您的意思是,对于日期和人员的每个组合,如果该人当天工作的有效小时数在有效小时数的 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

What I think you mean is that for each combination of day and person, you want to return it if the number of valid hours that that person worked on that day is within 2 hours of the number of valid hours that exist for that day. If so, this should do the trick:

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
遗忘曾经 2024-08-27 00:26:56

我认为您仍然需要进一步澄清您期望的结果。与此同时,这会让你开始吗?

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

I think you still need to clarify a bit further what you'd expect as a result. In the mean time, would this get you started?

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文