聚合单独列中的数据子集,无需子查询

问题描述 投票:0回答:1

我有一张桌子,我们称之为

transactions
,就像这样

交易ID 账户 地点 金额
1 齿轮 a 100
2 齿轮 a 150
3 齿轮 b 200
4 齿轮 b 100
5 销售 a 225
6 销售 a 75
5 销售 b 250
6 销售 b 100

我想对

amount
求和,按
location
account
有效分组,每个
account
有一个单独的列,就像这样

地点 cogs_total 销售总额
a 250 300
b 300 350

通常,我会通过像这样

JOIN
将表格与自身一起实现这一点

SELECT cogs.location,
    SUM(cogs.amount) AS 'cogs_total',
    sales.sales_total
FROM transactions cogs
LEFT JOIN (
    SELECT location,
        SUM(amount) AS 'sales_total'
    FROM transactions
    WHERE account = 'sales'
    GROUP BY location
) sales ON sales.location = cogs.location
WHERE cogs.account = 'cogs'
GROUP BY location;

但是,我正在使用的 API 仅提供受限制的 SQL 语法,不允许对这样的子查询进行

JOIN
操作。有没有办法绕过这个限制,让我通过不同的方式达到相同的结果?

背景信息

我正在使用的 API 是 Netsuite SuiteTalk REST API,查询使用 SuiteQL,它是 Oracle SQL 的子集。

我正在使用的实际表格与上面的示例类似。目标是能够返回会计部门的毛利率。我正在使用的实际数据与此类似

交易ID 账户 地点 部门 金额
1 齿轮 a 露营 100
2 齿轮 a 抹刀 150
3 齿轮 b 露营 200
4 齿轮 b 抹刀 100
5 销售 a 露营 150
6 销售 a 抹刀 200
5 销售 b 露营 250
6 销售 b 抹刀 150

我正在寻找的结果将更符合

地点 部门 cogs_total 销售总额 毛利率
a 露营 100 150 5%
a 抹刀 150 200 25%
b 露营 200 250 20%
b 抹刀 100 150 33%

毛利率=((收入 - COGS)/收入)* 100

我想提一下这些额外的细节,以防添加额外的分组依据列和用于计算毛利率的附加列会影响解决方案。

sql oracle suiteql
1个回答
0
投票

您需要条件聚合,如下所示:

SELECT location,
       sum(case when account = 'cogs' then amount end) as cogs_total,
       sum(case when account = 'sales' then amount end) as sales_total
  FROM transactions
GROUP BY location
© www.soinside.com 2019 - 2024. All rights reserved.