sql - 根据类型对具有相同 Id 的行求和,并排除 SUM = 0 的行
问题描述
我有这张桌子MOVEMENTS:
Id | FatherId | MovementType | Quantity |
=================================================
1 | A | IN | 10 |
2 | A | IN | 5 |
3 | A | OUT | 5 |
4 | B | IN | 10 |
5 | B | OUT | 10 |
6 | C | IN | 5 |
我正在尝试使用 IN - OUT Movments > 0 的总和来获取所有 FatherId。所以结果将是:
FatherId | Total |
=========================
A | 10 |
C | 5 |
FatherId = B 未显示,因为 SUM(MovementType = IN) - SUM (MovementType = OUT) = 0
我试过了
SELECT FatherId,
(SELECT (
SUM(CASE WHEN MovementType = 'IN' THEN Quantity ELSE 0 END) -
SUM(CASE WHEN MovementType = 'OUT' THEN Quantity ELSE 0 END)
)) AS Total
FROM MOVEMENTS
GROUP BY FatherId
ORDER BY FatherId
这给了我按父亲 ID 分组的结果,但我无法使用 Total > 0 进行过滤,而且我无法将此查询放在子查询中,例如:
SELECT * FROM MOVEMENTS WHERE FatherId IN (SELECT ....) OFFSET ... FETCH NEXT ... ROWS ONLY
这在没有存储过程的情况下可行吗?感谢您的任何帮助
解决方案
为什么要使用子查询?这应该做你想要的:
SELECT FatherId,
(SUM(CASE WHEN MovementType = 'IN' THEN Quantity ELSE 0 END) -
SUM(CASE WHEN MovementType = 'OUT' THEN Quantity ELSE 0 END)
) AS Total
FROM MOVEMENTS
GROUP BY FatherId
HAVING (SUM(CASE WHEN MovementType = 'IN' THEN Quantity ELSE 0 END) -
SUM(CASE WHEN MovementType = 'OUT' THEN Quantity ELSE 0 END)
) > 0;
您还可以简化逻辑以使用单个SUM()
:
SELECT FatherId,
SUM(CASE WHEN MovementType = 'IN' THEN Quantity
WHEN MovementType = 'OUT' THEN - Quantity
ELSE 0
END) AS Total
FROM MOVEMENTS
GROUP BY FatherId
HAVING SUM(CASE WHEN MovementType = 'IN' THEN Quantity
WHEN MovementType = 'OUT' THEN - Quantity
ELSE 0
END) > 0
ORDER BY FatherId;
推荐阅读
- c++ - std::move 不适用于 RValue 引用函数
- iis - 如何修复“错误:无法启动应用程序:启动会话时出错。”
- kubernetes - 如何在 kubeflow 中为用户 pvc 指定存储类
- python-3.x - Google colab:如何为 pytesseract 安装训练数据文件?
- wso2 - scim 请求的审核日志 WSO2 IDP
- mariadb - 从集群中删除 Galera 节点并在其中添加新节点
- java - CosmosDB 异步客户端:迭代器
> 它卡在 hasNext() 方法上 - ethereum - 在solidity中动态创建一个变量
- postgresql - 在雪花中使用什么用于 Postgres 中的 tstzrange 和 tsrange 类型
- c# - 如何在 C# 中比较两个不同类对象的相同属性?