目前,我有一张桌子,上面写着狗步行者的名字,他们走路的狗,以及他们在每个特定的会话中花了多少时间遛狗。
这是它的样子:
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
我相信我必须要么创建某种类型的连接或子查询来将它们加在一起,但我无法实现任何有效的方法。
答案 0 :(得分:0)
使用GROUP BY
和SUM
计算总数:
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)
我是否可以指出你确定步行时间长度的方法有点奇怪,如果有任何步行犬走过午夜的情况(这不需要花费数天时间),实际上会被打破?如果endtime
和starttime
是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;
如果starttime
和endtime
为TIMESTAMP
,那么我建议将它们投射到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;
希望这有帮助。