#sql #sum
#sql #сумма
Вопрос:
Привет, у меня есть таблица объединения, сказал TableA и TableB. В таблице есть столбец с именем Amount. В TableB есть столбец с именем refID. Я хотел бы суммировать столбец Amount, когда refID имеет то же значение. Я использовал SUM в своем запросе, но это выдало мне ошибку:
ORA-30483: window functions are not allowed here
30483. 00000 - "window functions are not allowed here"
*Cause: Window functions are allowed only in the SELECT list of a query.
And, window function cannot be an argument to another window or group
function.
Вот мой запрос для вашей справки:
select *
from (
select SUM(A.Amount), B.refId, Rank() over (partition by B.refID order by B.id desc) as ranking
from table A
left outer join table B on A.refID = B.refID
)
where ranking=1;
Могу ли я узнать, есть ли какое-либо альтернативное решение для того, чтобы я суммировал сумму?
Спасибо @!
Ответ №1:
select
SUM(A.Amount),
B.refId
from table A
left outer join table B on A.refID = B.refID
GROUP BY
B.refId
Ответ №2:
SELECT *
FROM (
SELECT A.Amount, B.refId,
Rank() over (partition by A.refID order by B.id desc) as ranking,
SUM(amount) OVER (PARTITION BY a.refId) AS asum
FROM tableA A
LEFT JOIN
tableB B
ON B.refID = A.refID
)
WHERE ranking = 1
Комментарии:
1. отличная идея! СУММА (amount) без OVER (РАЗДЕЛЕНИЕ ПО.refId) не работает. Я думал, является ли это причиной rank () в запросе, поэтому я не могу просто суммировать сумму таким образом? :0)
2. @huahsin68: пожалуйста, уточните, что вы подразумеваете под «не работает»: не выполняется синтаксический анализ, выдает ошибку, возвращает неправильные результаты чего?
Ответ №3:
Declare @T table(id int)
insert into @T values (1),(2)
Declare @T1 table(Tid int,fkid int,Amount int)
insert into @T1 values (1,1,200),(2,1,250),(3,2,100),(4,2,25)
Select SUM(t1.Amount) as amount,t1.fkid as id from @T t
left outer join @T1 t1 on t1.fkid = t.id group by t1.fkid
Ответ №4:
SELECT refid, sum(a.amount)
FROM table AS a LEFT table AS b USING (refid)
GROUP BY refid;
Ответ №5:
Я немного запутался. Отправленный вами запрос нигде не содержал функции SUM и выполнял самосоединение таблицы с именем «TABLE» к самой себе. Я собираюсь предположить, что у вас на самом деле есть две таблицы (я буду называть их TABLE_A и TABLE_B), и в этом случае это должно быть сделано следующим образом:
SELECT a.REFID, SUM(a.AMOUNT)
FROM TABLE_A a
INNER JOIN TABLE_B b
ON (b.REFID = a.REFID)
GROUP BY a.REFID;
Если я понял ваш вопрос, вы хотели получить результаты только тогда, когда у вас есть TABLE_B.REFID, который соответствует TABLE_A.REFID, поэтому ВНУТРЕННЕЕ объединение было бы уместным.
Делитесь и наслаждайтесь.