获取计算列的总和

时间:2018-06-11 23:52:49

标签: sql oracle sum

目前,我有一张桌子,上面写着狗步行者的名字,他们走路的狗,以及他们在每个特定的会话中花了多少时间遛狗。

这是它的样子:

SELECT WALKERS.LastName ||', '|| WALKERS.FirstName AS WalkerName, DOGS.Name 
AS DogName,
(trunc( extract(hour from endtime) * 60 + extract(minute from endtime))
 - (extract(hour from starttime) * 60 + extract(minute from starttime)) ) / 
60 AS LengthInHours

FROM WALKERS, DOGS, CUSTOMERS, JOBS

WHERE DOGS.OwnerPhoneNum = CUSTOMERS.phonenumber AND Walkers.PhoneNumber = 
JOBS.WalkerPhoneNum AND CUSTOMERS.phonenumber = JOBS.customerphonenum;

并且一些表格元素如下所示:

| WALKERNAME    | DOGNAME | LENGTHINHOURS
| Francis, Kay  | Daisy   | .5
| Fowler, Rex   | Coco    | 1
| Carlson, Bell | Axel    | .5
| Carlson, Bell | Axel    | 1

贝尔卡尔森的两次出场是我的问题所在。我想总结每个人花在特定狗身上的时间,而不是他们的个人会话,看起来像:

| Carlson, Bell | Axel | 1.5

我相信我必须要么创建某种类型的连接或子查询来将它们加在一起,但我无法实现任何有效的方法。

3 个答案:

答案 0 :(得分:0)

使用GROUP BYSUM计算总数:

SELECT
    WALKERS.LastName ||', '|| WALKERS.FirstName AS WalkerName
,   DOGS.Name AS DogName
,   SUM((trunc( extract(hour from endtime) * 60 + extract(minute from endtime))
 - (extract(hour from starttime) * 60 + extract(minute from starttime))) / 
60) AS LengthInHours
FROM WALKERS w
JOIN JOBS j ON w.PhoneNumber = j.WalkerPhoneNum 
JOIN CUSTOMERS c ON c.phonenumber = j.customerphonenum
JOIN DOGS d ON d.OwnerPhoneNum = c.phonenumber
GROUP BY w.LastName ||', '|| w.FirstName, d.Name 

使用ANSI连接以提高可读性和兼容性(这在过去十年左右是非常需要的。)

答案 1 :(得分:0)

我已经用条件使用JOIN替换了现代方法的连接逻辑。添加了GROUP BY子句和sum()聚合函数,以正确计算每个步行者和狗对的小时长度。还包括用于更短代码的表别名。

SELECT 
  w.LastName ||', '|| w.FirstName AS WalkerName, 
  d.Name AS DogName,
  sum((trunc( extract(hour from endtime) * 60 + extract(minute from endtime))
 - (extract(hour from starttime) * 60 + extract(minute from starttime)) ) / 
60) AS LengthInHours
FROM WALKERS w
JOIN JOBS j ON j.WalkerPhoneNum = w.PhoneNumber
JOIN DOGS d ON d.OwnerPhoneNum = c.phonenumber
JOIN CUSTOMERS c ON c.phonenumber = j.customerphonenum
GROUP BY 
  w.LastName ||', '|| w.FirstName,
  d.Name

答案 2 :(得分:0)

我是否可以指出你确定步行时间长度的方法有点奇怪,如果有任何步行犬走过午夜的情况(这不需要花费数天时间),实际上会被打破?如果endtimestarttime是Oracle DATE,那么您只需使用

(endtime - starttime) * 24

Oracle的日期算术以天为单位表示;乘以24得到小时数。

我建议在进行汇总后将其转换为数小时:

SELECT walkername, dogname, SUM(walktime) * 24 FROM (
    SELECT w.lastname || ', ' || w.firstname AS walkername
         , d.name AS dogname, endtime - starttime AS walktime
      FROM walkers w INNER JOIN jobs j
        ON w.phonenumber = j.walkerphonenum
     INNER JOIN customers c
        ON c.phonenumber = j.customerphonenum
     INNER JOIN dogs d
        ON d.ownerphonenum = c.phonenumber
) GROUP BY walkername, dogname;

如果starttimeendtimeTIMESTAMP,那么我建议将它们投射到DATE以简化算术:

SELECT walkername, dogname, SUM(walktime) * 24 FROM (
    SELECT w.lastname || ', ' || w.firstname AS walkername
         , d.name AS dogname
         , CAST(endtime AS DATE) - CAST(starttime AS DATE) AS walktime
      FROM walkers w INNER JOIN jobs j
        ON w.phonenumber = j.walkerphonenum
     INNER JOIN customers c
        ON c.phonenumber = j.customerphonenum
     INNER JOIN dogs d
        ON d.ownerphonenum = c.phonenumber
) GROUP BY walkername, dogname;

希望这有帮助。

相关问题