#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.