Получение суммы рассчитанного столбца - PullRequest
0 голосов
/ 12 июня 2018

В настоящее время у меня есть таблица, в которой указано имя «выгула собак», «собаки», которую они выгуливают, и сколько времени они проводили, выгуливая собаку в каждой конкретной сессии.

Вот как это выглядиткак:

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

В двух случаях появления Белла Карлсона моя проблема.Я хочу суммировать длину, которую каждый человек потратил на прогулку с конкретной собакой, а не на отдельные сессии, чтобы она выглядела так:они вместе, но я не смог реализовать что-либо, что работает.

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Я заменил логику объединения для современного подхода, использующего 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
0 голосов
/ 12 июня 2018

Могу ли я указать, что ваш метод определения продолжительности ходьбы немного странный и на самом деле нарушается, если есть какие-либо случаи, когда гулять с собаками гуляют собаки до полуночи (это не учитывает дни)?Если endtime и starttime - Oracle DATE s, то вы можете просто использовать

(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;

Надеюсь, это поможет.

0 голосов
/ 12 июня 2018

Используйте 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 для удобства чтения и совместимости (это было очень требовательным в течение последнего десятилетия или около того).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...