MAX не работает должным образом в Oracle - PullRequest
0 голосов
/ 23 сентября 2011

У меня есть SQL-запрос

SELECT spt.paymenttype,
  MAX(nest.paytypetotal) total
FROM sportpaymenttype spt
INNER JOIN (SELECT spt.paymenttype,
              SUM(sod.detailunitprice * sod.detailquantity) paytypetotal
            FROM sportorderdetail sod
            INNER JOIN sportorder so ON so.orderid = sod.orderid
            INNER JOIN sportpaymenttype spt ON spt.paymenttype = so.paymenttype
            GROUP BY spt.paymenttype) nest ON nest.paymenttype = spt.paymenttype
GROUP BY spt.paymenttype;

Я ожидаю, что он вернет одну строку (из-за функции MAX), однако он возвращает 4 строки.Я придумал болезненный способ сделать это правильно, но мне интересно, почему функция max ведет себя так?

Кроме того, это результаты, где я ожидаю только первое

PAYMENTTYPE   TOTAL
Loan          8640.95
Check         147.34
Credit Card   479.93
Cash          25.95

Мне было интересно, есть ли лучший способ сделать это ...

SELECT spt.paymenttype,
  nest.paytypetotal total
FROM sportpaymenttype spt
INNER JOIN (SELECT spt.paymenttype,
              SUM(sod.detailunitprice * sod.detailquantity) paytypetotal
            FROM sportorderdetail sod
            INNER JOIN sportorder so ON so.orderid = sod.orderid
            INNER JOIN sportpaymenttype spt ON spt.paymenttype = so.paymenttype
            GROUP BY spt.paymenttype) nest ON nest.paymenttype = spt.paymenttype
WHERE nest.paytypetotal = (SELECT MAX(nest.paytypetotal)
                           FROM (SELECT spt.paymenttype,
                             SUM(sod.detailunitprice * sod.detailquantity) paytypetotal
                           FROM sportorderdetail sod
                           INNER JOIN sportorder so ON so.orderid = sod.orderid
                           INNER JOIN sportpaymenttype spt ON spt.paymenttype = so.paymenttype
                           GROUP BY spt.paymenttype) nest);

Спасибо.

Ответы [ 2 ]

2 голосов
/ 23 сентября 2011

Это ведет себя так, потому что вы говорите Oracle группировать по paymenttype

Если вы сделаете MAX(spt.paymenttype) и удалите GROUP BY, то это будет работать так, как вы хотите.

0 голосов
/ 23 сентября 2011

Функция MAX является совокупной.Когда вы используете GROUP BY (в вашем случае «GROUP BY spt.paymenttype» в конце), агрегат применяется к каждой группе, созданной GROUP BY, а не к набору результатов в целом.Вы получили одну строку результатов для каждого типа платежа, как это должно делать GROUP BY при отсутствии фильтров.

Чтобы получить одну строку, выберите нужный тип платежа и добавьте

* 1004.*

в самом конце запроса.Если вам нужно максимальное значение для всех значений типа оплаты, возможно, проще всего (не обязательно лучше) превратить все это в подзапрос, а затем выбрать из него наибольшее значение платежа.

...