Как запросить total, когда у меня есть таблица объединения

#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, поэтому ВНУТРЕННЕЕ объединение было бы уместным.

Делитесь и наслаждайтесь.