我有一张桌子,我们称之为
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
我想提一下这些额外的细节,以防添加额外的分组依据列和用于计算毛利率的附加列会影响解决方案。
您需要条件聚合,如下所示:
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