将值与同一表中的其他行进行比较,并返回汇总结果

时间:2019-02-12 09:17:23

标签: sql sql-server tsql

我正在尝试计算用户的总体验。注意事项:

  • 每次体验都是一排,
  • 一行将具有 timePeriodStart timePeriodEnd currentlyWorking

我当前的查询以几天为单位获取总经验。

SELECT SUM(DATEDIFF(DAY, EX.TimePeriodStart,
                                           CASE
                                               WHEN EX.TimePeriodEnd IS NULL
                                               THEN GETUTCDATE()
                                               ELSE EX.TimePeriodEnd
                                           END)) AS 'TotalExpInDays', 
                    EX.UserPersonalDetailsId
             FROM Experience EX
             GROUP BY EX.UserPersonalDetailsId

但是,用户可以在特定时间段内完成多项工作。因此,我决定从总时间中减去通用天数。

我用于计算平日的查询:

SELECT SUM(CASE
           WHEN EX.TimePeriodStart BETWEEN EX2.TimePeriodStart AND EX2.TimePeriodEnd
           THEN DATEDIFF(DAY, EX.TimePeriodStart,
                                 CASE
                                     WHEN EX2.TimePeriodEnd IS NULL
                                     THEN GETUTCDATE()
                                     ELSE EX2.TimePeriodEnd
                                 END)
           ELSE 0
       END) AS 'DaysToSub', 
   EX.UserPersonalDetailsId
FROM Experience EX
     LEFT JOIN Experience EX2 ON EX2.UserPersonalDetailsId = EX.UserPersonalDetailsId
                                 AND EX2.ExperienceId != EX.ExperienceId
WHERE EX.UserPersonalDetailsId = UserPersonalDetailsId -- userId-int
GROUP BY EX.UserPersonalDetailsId

这是link的小提琴(针对MySQL稍作修改)

此查询的问题:如果有两个重叠的日期,但是如果有两个以上的重叠行,则显示正确的值(如果将同一日期与多于一个的行进行比较,这是合乎逻辑的),它将给出正确的值。如何避免这种情况?

在这里写下这个问题感到很复杂,我试图使其尽可能简单。任何帮助将不胜感激。

编辑:

示例输入:

Id | startdate           | enddate             | UserId
-: | :------------------ | :------------------ | -----:
 1 | 01/03/2018 00:00:00 | 31/03/2018 00:00:00 |      1
 4 | 18/04/2019 00:00:00 | 15/05/2019 00:00:00 |      1
 2 | 15/03/2018 00:00:00 | 15/04/2018 00:00:00 |      1
 3 | 17/04/2018 00:00:00 | 15/04/2019 00:00:00 |      1

所需的输出:

Id | startdate           | enddate             | UserId
-: | :------------------ | :------------------ | -----:
 1 | 01/03/2018 00:00:00 | 31/03/2018 00:00:00 |      1
 4 | 18/04/2019 00:00:00 | 15/05/2019 00:00:00 |      1
 2 | 31/03/2018 00:00:00 | 15/04/2018 00:00:00 |      1
 3 | 17/04/2018 00:00:00 | 18/04/2019 00:00:00 |      1

这个问题对我来说很复杂。似乎无法解决我的问题!

0 个答案:

没有答案