【问题标题】:Is it possible to get the sum while executing a join?执行连接时是否可以得到总和?
【发布时间】:2013-03-28 08:40:27
【问题描述】:

我有这个代码:

select id,
p1.value as company,
p2.value as budget

FROM  process p

LEFT JOIN Param p1 on p1.ID = p.ID AND p1.NAME = 'Company'
LEFT JOIN Param p2 ON p2.ID = p.ID AND p2.NAME = 'Budget'

where type = 'Authorization';

我的公司很少。这里的示例结果是:

Company      Budget

Goodis       10000
McDonalds    15000
Goodis       500
Goodis       100
Everest      100
McDonalds    1000
Everest      10000

我想要做的是获得每家公司的预算总和(我不能在 where 子句中分离公司,因为我需要整个数据并且有很多公司)。仅在 SQL 中完成对我来说似乎有点困难。我正在尝试做一个 BIRT 报告,所以,如果你有任何关于 BIRT 级别的建议,我也会很高兴!

这是一种方法吗,还是我的尝试毫无意义?

【问题讨论】:

    标签: sql oracle birt


    【解决方案1】:

    我相信你想要一个分析函数:

    select id, p1.value as company, p2.value as budget,
           sum(p2.value) over (partition by p1.value) as CompanyBudget
    FROM  process p
    LEFT JOIN Param p1 on p1.ID = p.ID AND p1.NAME = 'Company'
    LEFT JOIN Param p2 ON p2.ID = p.ID AND p2.NAME = 'Budget'
    where type = 'Authorization';
    

    这将返回每行的总预算,但不会减少行数。

    【讨论】:

      【解决方案2】:

      GROUP BY p1.valueSUM 一起使用:

      select 
        p.value as company,
        COALESCE(SUM(p2.value), 0) as Totalbudget
      FROM  Param AS p
      LEFT JOIN process AS p1 ON p.ID = p1.ID AND p.NAME = 'Company'
      LEFT JOIN process AS p2 ON p.ID = p2.ID AND p.NAME = 'Budget'
      GROUP BY p.value;
      

      【讨论】:

      • 我刚刚得到了与帖子中提到的相同的结果。 :(
      • @Slim 它应该可以正常工作。您能否从paramprocess 这两个表中发布一些示例数据,这将有助于解释这个问题。谢谢
      • 它运行得不好,我会解释你为什么。 :) 问题是COALESCE(SUM(p2.value), 0) as Totalbudget 得到了返回(当前)行的SUM,所以根本没有区别,因为我们没有得到与公司相关的所有行的总和。跨度>
      • @Slim - 请查看我的编辑,这只是一个猜测。这就是为什么我需要知道这两个表中的一些示例数据以了解这两个表如何相互关联,您还需要将 where 子句添加到 LEFT JOIN 而不是 where 子句。
      【解决方案3】:

      看看这是否有帮助 -

      SELECT id, company, SUM(NVL(budget, 0)) AS budget
      FROM
      (
         SELECT id,
         p1.value AS company,
         p2.value AS budget
         FROM  process p
         LEFT JOIN Param p1 on p1.ID = p.ID AND p1.NAME = 'Company'
         LEFT JOIN Param p2 ON p2.ID = p.ID AND p2.NAME = 'Budget'
         WHERE TYPE = 'Authorization'
      )
      WHERE company IS NOT NULL
      GROUP BY id, company
      

      【讨论】:

      • 感谢您帮助我!我又得到了同样的结果。 :(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多