Попытка вывести только бронирования на общую сумму более 2000 долларов - PullRequest
0 голосов
/ 05 декабря 2018
SELECT 
    reservationWH.RNUM AS Reservation, 
    packageWH.PNAME AS "Package Name", 
    (COUNT(guestWH.CELL_PHONE) * packageWH.COSTPERSON) AS "Total Cost"
FROM 
    packageWH 
INNER JOIN 
    reservationWH ON packageWH.P_ID = reservationWH.P_ID 
INNER JOIN 
    guestWH ON reservationWH.RNUM = guestWH.RNUM
WHERE 
    (COUNT(guestWH.CELL_PHONE)) * packageWH.COSTPERSON > 2000
GROUP BY 
    reservationWH.RNUM
ORDER BY 
    reservationWH.RNUM ASC

Я получаю эту ошибку:

Агрегат может не отображаться в предложении WHERE, если он не входит в подзапрос, содержащийся в предложении HAVING или списке выбора, а столбец агрегируется.является внешней ссылкой.

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Без доступа к данным или какой-либо видимости желаемого результата, решение этой проблемы - игра в догадки.Возможно, вам нужно переместить группировку в подзапрос, и таким образом вы можете использовать предложение where, например,

SELECT
    reservationWH.RNUM                   AS Reservation
  , packageWH.PNAME                      AS "Package Name"
  , (g.num_cells * packageWH.COSTPERSON) AS "Total Cost"
FROM packageWH
INNER JOIN reservationWH ON packageWH.P_ID = reservationWH.P_ID
INNER JOIN (
        SELECT
            RNUM
          , COUNT( CELL_PHONE ) num_cells
        FROM guestWH
        GROUP BY
            RNUM
    ) g ON reservationWH.RNUM = g.RNUM
WHERE (g.num_cells * packageWH.COSTPERSON) > 2000
ORDER BY
    reservationWH.RNUM ASC

Но без выборочных данных и ожидаемый результат это невозможно для меня проверить.

0 голосов
/ 05 декабря 2018

Если я предполагаю, что вы хотите одну строку для резервирования, то удалите PNAME из запроса.Кроме того, если я предположу, что g.CELL_PHONE никогда не будет NULL, тогда:

SELECT r.RNUM AS Reservation, 
       SUM(p.COSTPERSON) AS "Total Cost"
FROM packageWH p INNER JOIN 
     reservationWH
     ON p.P_ID = r.P_ID INNER JOIN 
     guestWH g
     ON r.RNUM = g.RNUM
GROUP BY r.RNUM
HAVING SUM(p.COSTPERSON) > 2000
ORDER BY r.RNUM ASC;

Примечания:

  • Требуется фильтрация по столбцу агрегации в предложении HAVINGне предложение WHERE.
  • Если вы хотите одну строку для резервирования, то вы должны агрегировать только путем агрегации.
  • Вы, кажется, хотите суммироватьстоит на человека, поэтому SUM() имеет больше смысла, чем COUNT().
  • Псевдонимы таблиц облегчают написание и чтение запроса.
0 голосов
/ 05 декабря 2018

Вы должны включить пункт, как показано ниже

    SELECT reservationWH.RNUM AS Reservation, packageWH.PNAME AS "Package Name" , 
   COUNT(guestWH.CELL_PHONE)* sum(packageWH.COSTPERSON) AS "Total Cost"
    FROM packageWH INNER JOIN reservationWH ON packageWH.P_ID=reservationWH.P_ID INNER JOIN guestWH ON reservationWH.RNUM=guestWH.RNUM
    GROUP BY reservationWH.RNUM,packageWH.PNAME
    having (COUNT(guestWH.CELL_PHONE)*sum(packageWH.COSTPERSON)) > 2000
    ORDER BY reservationWH.RNUM ASC
...