【问题标题】:Select Distinct with Sum选择与 Sum 不同
【发布时间】:2017-02-09 12:10:56
【问题描述】:

有一个员工表,其中每人每天重新排序一个条目。

我创建了这个查询并且它有效,但它应该是员工从一开始就拥有的总小时数,而不是过去一周的总工作小时数。

有人可以帮忙吗?我迷路了。谢谢你。

SELECT SSN, firstname, Lastname, SUM(CAST(Hours as float)) AS HourstoDate 
FROM Employees
WHERE CAST(Scheduled as datetime) >= DateAdd( d, DateDiff( d, 0, GetDate()-5 ), 0 )
GROUP BY SSN, Lastname, FirstName

SSN     FirstName   LastName    Scheduled       Hours
1234    Jane        Doe         Monday 9/26     10
1234    Jane        Doe         Tuesday 9/27    10

它应该会拉 Jane 的条目,因为她这周工作,但小时数必须是 1525,而不是她这周工作的 20。

【问题讨论】:

  • 去掉WHERE子句那么简单吗?
  • 放入表结构和一些插入数据。它将有助于调试您的查询。
  • 需要在哪里,因为它只能是上周工作的人,而不是从一开始就工作的人。

标签: mysql sql-server sql-server-2008 ssms ssms-2016


【解决方案1】:

您可以更改您的过滤器,使其对所有小时求和首先,然后确保满足“本周工作”条件(使用having 子句),如下所示:

SELECT SSN, firstname, Lastname, SUM(CAST(Hours as float)) AS HourstoDate, max(case when CAST(Scheduled as datetime) >= DateAdd( d, DateDiff( d, 0, GetDate()-5 ), 0 ) then 1 else 0 end) as worked_this_week
FROM Employees
GROUP BY SSN, Lastname, FirstName
HAVING max(case when CAST(Scheduled as datetime) >= DateAdd( d, DateDiff( d, 0, GetDate()-5 ), 0 ) then 1 else 0 end) = 1

【讨论】:

    【解决方案2】:

    查询不起作用,因为您将同一张表上的两个搜索合二为一。您不能搜索某个日期之后的记录并同时检索从该时间开始的所有记录。

    在这些情况下,我的方法是将表与自身连接起来。理想情况下应该是这样的:

    select
      z.ssn
    , z.firstname
    , z.lastname
    , sum ( cast ( eo.hours as float ) ) as hourstodate
    from (
        select distinct
          ei.ssn
        , ei.firstname
        , ei.lastname
        from
          employees ei
        where
              cast ( ei.scheduled as datetime ) > dateadd ( ei.d , datediff ( ei.d , 0 , getdate() - 5 ) , 0 )
    ) z
    join employees eo on ( z.ssn = eo.ssn and z.firstname = eo.firstname and z.lastname = eo.lastname )
    group by
      z.ssn
    , z.lastname
    , z.firstdate
    

    我无法尝试,所以我不能保证它会起作用。如果返回错误,请随意添加评论。

    编辑:错误输入

    【讨论】:

      猜你喜欢
      • 2022-08-10
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      相关资源
      最近更新 更多