【问题标题】:How to query total when I have a join table当我有一个连接表时如何查询总计
【发布时间】:2011-04-15 10:50:25
【问题描述】:

你好, 我有一个连接表,表示 tableA 和 tableB。 tableA 有一个名为 Amount 的列。 tableB 有一个名为 refID 的列。当 refID 具有相同的值时,我想合计 Amount 列。我在查询中使用了 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;

我可以知道是否有任何替代解决方案可以让我对金额求和?

谢谢@!

【问题讨论】:

    标签: sql sum


    【解决方案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
      

      【讨论】:

      • 不错的一个!没有 OVER (PARTITION BY a.refId) 的 SUM(amount) 不起作用。我在想这是否是由查询中的 rank() 引起的,因此我不能以这种方式对金额求和? :0)
      • @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 匹配时才需要结果,因此 INNER JOIN 是合适的。

          分享和享受。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-17
            • 1970-01-01
            • 2021-03-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多