прозоречни функции на Oracle

Може ли някой да ми помогне с това запитване:

SELECT SUM(summa), name, 
       TO_CHAR(invoice_date, 'YYYY/mm') 
           OVER (PARTITON EXTRACT(MONTH FROM i.invoice_date, c.name) 
FROM invoice i, customer c 
WHERE i.customer_id = c.id
AND months_between(sysdate, invoice_date) = 3
AND rownum < 11 GROUP BY invoice_date, name
ORDER BY SUM(SUMMA) DESC;

Предполага се, че ще получи първите десет реда от последните три месеца, групирани по месеци и подредени по сума.

Благодаря.


person Novice    schedule 11.05.2015    source източник
comment
Не е ясно за какво искате помощ...също така демонстрация на вашите данни, от които правите заявки, също може да бъде полезна.   -  person DrCord    schedule 11.05.2015
comment
Имате несъответстващи скоби, невалиден синтаксис, грешно изписани ключови думи...   -  person Tony Andrews    schedule 11.05.2015
comment
Не знам много за oracle, но OVER(), приложено към не-агрегат, изглежда грешно.   -  person Hart CO    schedule 11.05.2015


Отговори (1)


Първо, използвайте правилен изричен join синтаксис. Второ, имате нужда от row_number():

SELECT t.*
FROM (SELECT SUM(summa) as sumsumma, name, 
             TO_CHAR(invoice_date, 'YYYY/mm') as yyyymm,
             ROW_NUMBER() OVER (PARTITION BY TO_CHAR(invoice_date, 'YYYY/mm')
                                ORDER BY SUM(summa) DESC
                               ) as seqnum
      FROM invoice i JOIN
           customer c 
           ON i.customer_id = c.id
      WHERE months_between(sysdate, invoice_date) = 3
      GROUP BY invoice_date, name
     ) t
WHERE seqnum <= 10
ORDER BY sumsumma DESC;
person Gordon Linoff    schedule 11.05.2015
comment
Благодаря ви много, решихте го по-бързо, отколкото успях да генерирам тестови данни. Ако това не ви притеснява, може би бихте могли да обясните защо е необходимо изричното присъединяване? - person Novice; 11.05.2015
comment
@Новак. . . Явните съединения са част от стандарта ANSI от десетилетия – и се поддържат от Oracle почти толкова дълго. Те са по-мощни, защото могат ефективно да изразяват външни съединения. Освен това повечето хора намират изричния синтаксис join по-лесен за следване. - person Gordon Linoff; 12.05.2015