Sql 在执行联接时是否可以获取和?

Sql 在执行联接时是否可以获取和?,sql,oracle,birt,Sql,Oracle,Birt,我有以下代码: 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'; 我几乎没有公司。这里的示例结果是: Compan

我有以下代码:

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水平,我也会非常高兴


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

使用
按p1分组。值
总和

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;
看看这是否有帮助-

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

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

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';

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

我刚刚得到了与帖子中提到的相同的结果:(@Slim它应该工作得很好。你能从两个表
param
process
中发布一些示例数据吗?解释这个问题会很有帮助。ThanksIt工作不好,我会向你解释原因。:)问题是
合并(SUM(p2.value),0)由于Totalbudget
正在获取返回(当前)行的
总和,因此没有任何区别,因为我们没有获取与公司关联的所有行的总和。@Slim-请参见我的编辑,这只是一个猜测。这就是为什么我需要了解这两个表中的一些示例数据,以了解这两个表之间的关系,您还需要将where子句添加到
左连接中,而不是where子句。感谢您的帮助!我又得到了同样的结果(