2015-05-11 3 views
0

Может кто-нибудь помочь мне с этим запросом:оракул оконные функции

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; 

Полагал получить первые десять строк из последних трех месяцев, сгруппированных по месяцам и упорядоченные по сумме.

Спасибо.

+3

Пока неясно, что вы просите за помощь ... также демо ваших данных вы запрашиваете из может быть полезной. – DrCord

+2

У вас есть несогласованные круглые скобки, недопустимый синтаксис, ключевые слова misspelt ... –

+1

Я не знаю много о оракуле, но 'OVER()', примененный к неагрегату, кажется неправильным. –

ответ

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; 
+0

Большое вам спасибо, вы решили это быстрее, чем я мог бы генерировать тестовые данные. Если это не слишком беспокоит вас, возможно, вы могли бы объяснить, почему требуется явное соединение? – Novice

+0

@Novice. , , Явные объединения были частью стандарта ANSI на протяжении десятилетий - и поддерживались Oracle почти так же долго. Они более мощные, потому что они могут эффективно выражать внешние соединения. Кроме того, большинство людей находят, что явный синтаксис 'join' проще отслеживать. –

Смежные вопросы