SQL CTE Не возвращает сумму

#sql #aggregate-functions #common-table-expression

#sql #агрегатные функции #common-table-expression

Вопрос:

Я пытаюсь просуммировать все строки сведений о счете и вернуть 1 строку с общей суммой, используя CTE. Однако приведенный ниже CTE просто возвращает одну из строк счета. Что я делаю не так? Спасибо.

 with getinvoices as
(
    select 
        i.invoice_nbr,
        i.invoice_type_id,
        i.invoice_type_desc,
        i.invoice_total_amount,
        row_number() over (partition by i.invoice_nbr order by i.rowid) rn,
        sum(i.line_amount) as "Sum Of Line Amount"
    from
        ods_dev.invoices i
    where
        i.invoice_date >= '7/1/2020' 
        and i.invoice_date < '7/2/2020'
        and i.invoice_nbr is not null
    group by
        i.invoice_nbr, i.invoice_type_id, 
        i.invoice_type_desc, i.invoice_total_amount, i.rowid
)
select *
from getinvoices g
where g.rn = 1
order by g.invoice_nbr
  

Комментарии:

1. Какова цель row_number() ? Примеры данных, желаемые результаты и объяснение логики помогли бы. Кроме того, пометьте базу данных, которую вы используете.

Ответ №1:

Я предполагаю, что вам просто нужен запрос на агрегацию:

 SELECT i.invoice_nbr, i.invoice_type_id, i.invoice_type_desc, i.invoice_total_amount,
       SUM(i.line_amount) as "Sum Of Line Amount"
FROM ods_dev.invoices i
WHERE i.invoice_date >= '2020-07-01' and i.invoice_date < '2020-07-02' and
      i.invoice_nbr IS NOT NULL
GROUP BY i.invoice_nbr, i.invoice_type_id, i.invoice_type_desc, i.invoice_total_amount
  

Комментарии:

1. Спасибо, Гордон, это возвращает правильную сумму. Есть ли способ выполнить это с помощью CTE? Возможно, мне потребуется выделить определенную строку из каждого набора, если в каждом разделе есть конкретная деталь, на которую нужно обратить внимание, но мне все равно нужна сумма всех строк. Возможно, мне потребуется использовать другую функцию Windows.

2. @WinstonSnyder . . . Вы можете обернуть практически любой запрос в CTE.