sql - UNPIVOT 使用 FULL OUTER JOIN 和 SUM 的查询
问题描述
我有一个帐户和收入表,我正在尝试合并它们,然后再取消它们。
以下是每个表中的值:
收入:
账户:
我已经总结了所有内容并使用以下 sql 语句计算了差异:
SELECT SUM(Income_tbl.Income) AS Income, SUM(Accounts_tbl.Amount) AS Debt, SUM(Income_tbl.Income) - SUM(Accounts_tbl.Amount) AS difference
FROM Accounts_tbl
FULL OUTER JOIN Income_tbl
ON Accounts_tbl.id = Income_tbl.id
这是结果:
我想要做的是通过添加一个包含收入、债务和差异字段的“类型”列和一个包含金额的“AMT”列来取消这一点。
所以是这样的:
谢谢大家!
解决方案
我不知道 afull outer join
对此是否正确,但这不是您的问题。但是,只需使用子查询:
SELECT v.*
FROM (SELECT SUM(i.Income) AS Income,
SUM(a.Amount) AS Debt,
SUM(i.Income) - SUM(a.Amount) AS difference
FROM Accounts_tbl a FULL OUTER JOIN
Income_tbl i
ON a.id = i.id
) ai CROSS APPLY
(VALUES ('Income', Income), ('Debt', Debt), ('Difference', difference)
) v(type, amt);
这样做可能效率更高:
with ai as (
select 'income' as type, sum(income) as amt
from income_tbl
union all
select 'debt', sum(amount) as amt
from accounts_tbl
)
select ai.*
from ai
union all
select 'difference',
sum(case when type = 'income' then amt else - amt end)
from ai;
推荐阅读
- typescript - 如何更新我的 heroku 服务器上的 typescript 编译器?
- android - 使用滚动视图时,Android 和 iOS 上的滑动手势之间的行为差异
- visual-studio - 如何快速修复 .net 核心解决方案中的所有 Nuget 引用?
- oracle - 在 Oracle 中使用 OR 运算符执行具有多个子查询的外部查询
- php - “将变量添加到 mysqli”
- c# - 表未显示输出
- ruby-on-rails - f.select 的自定义字段 - 允许用户输入
- java - 如何使用来自 java 代码的输入并将其传输到外部应用程序(以及检索输出)?
- java - 无法使用 java 生成 AAD 令牌
- python - 在 miniconda docker 镜像中升级 Python3.7.4 版本