【问题标题】:Join two tables using a loop and SUM使用循环和 SUM 连接两个表
【发布时间】:2016-12-30 21:49:19
【问题描述】:

我有一个包含列的表 (distance_travelled)
主键 |车辆名称 |开始日期 |结束日期 |总距离


另一个名为 Idling 的表,带有列
车辆名称 |持续时间 |时间戳

我已采取措施走得更远,但提出问题的最佳方式是从头开始
我希望输出是带有列的下表
车辆名称 |开始日期 |结束日期 |总距离 |持续时间(每个 startDate 和 enddate 之间的持续时间总和

【问题讨论】:

  • 我完全不明白你如何计算duration。你能详细说明一下吗?
  • 我们可以看看你尝试了什么吗?提示:使用适当的软件(MySQL、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。
  • Diuration 是一个运行在移动端的计时器。我将秒数转换为 HH:MM 格式并将其插入表中。我有下面的答案 - 感谢您研究它。

标签: sql tsql join


【解决方案1】:

交叉申请可能很适合这里。

但是,对于 ID 2,我得到 18:15(8:15 和 10:00 的总和)。可能是原始问题中的拼写错误/错误,或者需要额外的逻辑。

我应该注意,小时数可以超过 24,以防它跨越多天。

Select A.*
      ,Duration = Format(IsNull(B.Seconds,0)/3600    ,'00')    -- Hours 00 - 99
                 +Format(IsNull(B.Seconds,0)%3600/60,':00')    -- Minutes
                 --+Format(IsNull(B.Seconds,0)%60     ,':00')  -- Seconds
 From  Distance_Travelled A
 Cross Apply (
              Select Seconds = sum(DateDiff(SECOND,'1900-01-01',Duration))
              From   Idling 
              Where  VehicleName = A.VehicleName
                and  TimeStamp between A.StartDate and A.EndDate
       ) B

返回

【讨论】:

  • 这是原始问题中的错字。感谢您的帮助
  • @SunnyGill 很高兴它有帮助。也很高兴得知这只是一个错字。
【解决方案2】:

有点讨厌,但你明白了:

select
    dt.id,
    dt.VehicleName,
    dt.StartDate,
    dt.EndDate,
    dt.Total_Distance,
    substring(cast(convert(time,dateadd(millisecond,sum(datediff(millisecond,0,cast([Duration] as datetime))),0),108) as varchar),0,9) [Duration],
    case when substring(cast(convert(time,dateadd(millisecond,sum(datediff(millisecond,0,cast([Duration] as datetime))),0),108) as varchar),0,9) is null then 
        'no duration...'
    else
        'sum between ' + convert(varchar, dt.StartDate, 108) + ' and ' + convert(varchar, dt.EndDate, 108)
    end as [Duration]
from
    distance_travelled dt
    left join idling i on 
         dt.vehiclename = i.VehicleName and
         i.TimeStamp between dt.StartDate and dt.EndDate
group by
    dt.id,
    dt.VehicleName,
    dt.StartDate,
    dt.EndDate,
    dt.Total_Distance

【讨论】:

  • 我将只使用substring(cast(convert.. 部分嵌套查询结果,并在顶层添加CASE 语句。这将使代码更简洁。有点讨厌,但你明白了。
  • 用户 John Cappaletti 的工作效率也更高。但是谢谢 - 左连接适用于我即将发布的另一个示例 - 但不会因为你有答案。
猜你喜欢
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多