如果行中的初始值在 SQL 中为 < 或 > 0,如何返回单独的列总和
Posted
技术标签:
【中文标题】如果行中的初始值在 SQL 中为 < 或 > 0,如何返回单独的列总和【英文标题】:How to Return Separate Sums of Columns if Initial Value in row is < or > 0 in SQL 【发布时间】:2021-11-14 04:40:01 【问题描述】:我正在尝试编写一个 SQL 查询,该查询将根据值是负数还是正数,返回每个客户的发货零件编号总和的唯一行。例如:
如果我们两次将 20 个 Z 部件运送给客户 A,而他们将 6 个部件退回给我们,则会显示:
+-----------------+-------------+---------+
| Customer_Number | Part_Number | Shipped |
+-----------------+-------------+---------+
| A | Z | 20 |
| A | Z | 20 |
| A | Z | -6 |
+-----------------+-------------+---------+
运行查询后,预期结果:
+-----------------+-------------+---------+
| Customer_Number | Part_Number | Shipped |
+-----------------+-------------+---------+
| A | Z | 40 |
| A | Z | -6 |
+-----------------+-------------+---------+
我想出的查询是:
SELECT
Customer_Number,
Part_Number,
CASE
WHEN Ship_Quantity > 0 THEN SUM(Ship_Quantity)
WHEN Ship_Quantity < 0 THEN SUM(Ship_Quantity)
END
FROM Sales_Line
GROUP BY
Customer_Number,
Part_Number
但我得到错误:
列无效。必须是按列分组:SELECT 中的 Ship_Quantity 列表。
当我将“Ship_Quantity”添加到我的 GROUP BY 时,它不会给出准确的结果:
原始输入:
+-----------------+---------------+---------+
| Customer_Number | Part_Number | Shipped |
+-----------------+---------------+---------+
| A080 | C76 | -11.0 |
| A080 | C76 | -1.0 |
| A080 | C76 | -2.0 |
| A080 | C76 | -1.0 |
| A080 | C76 | -1.0 |
| A080 | C76 | 21.0 |
| A080 | C76 | 79.0 |
| A080 | C76 | 1.0 |
| A080 | C76 | 11.0 |
| A080 | C76 | 99.0 |
| A045 | X150 | -6.0 |
| A045 | X150 | -1.0 |
| A045 | X150 | -11.0 |
| A045 | X150 | -2.0 |
| A045 | X150 | -1.0 |
| A045 | X150 | -1.0 |
| A045 | X150 | -1.0 |
| A045 | X150 | 373.0 |
| A045 | X150 | 12.0 |
| A045 | X150 | 1.0 |
| A045 | X150 | 300.0 |
| A045 | X150 | 146.0 |
| A045 | X150 | 150.0 |
| A045 | X150 | 150.0 |
| A045 | X150 | 200.0 |
| A045 | X150 | 150.0 |
| A045 | X150 | 150.0 |
+-----------------+---------------+---------+
查询后:
+-----------------+---------------+---------+
| Customer_Number | Part_Number | Shipped |
+-----------------+---------------+---------+
| A045 | X150 | 300.0 |
| A045 | X150 | 373.0 |
| A080 | C76 | -11.0 |
| A080 | C76 | -2.0 |
| A080 | C76 | -3.0 |
+-----------------+---------------+---------+
我该怎么做呢?
【问题讨论】:
<>0
怎么样,<0
或>0
表示不为零?很抱歉对 SQL 不熟悉。
@tailsparkrabbitear 结果相同
【参考方案1】:
在GROUP BY
子句中使用函数SIGN()
:
SELECT Customer_Number, Part_Number,
SUM(Shipped) Shipped
FROM Sales_Line
GROUP BY Customer_Number, Part_Number, SIGN(Shipped)
如果您的数据库不支持函数SIGN()
,请使用CASE
表达式:
SELECT Customer_Number, Part_Number,
SUM(Shipped) Shipped
FROM Sales_Line
GROUP BY Customer_Number, Part_Number,
CASE WHEN Shipped < 0 THEN -1 ELSE 1 END
请参阅demo。
【讨论】:
谢谢!这正是我想要的!我能问一下我将如何将底片作为额外的列吗?例如,将所有发货金额放在一个列中,将所有退回的金额放在另一个列中 @legendaryxv2 检查这个:dbfiddle.uk/… 非常感谢!以上是关于如果行中的初始值在 SQL 中为 < 或 > 0,如何返回单独的列总和的主要内容,如果未能解决你的问题,请参考以下文章
如果行在其他列中具有相同的数据,则 SQL 查询 CONCAT/列出唯一列数据?
如果行不是重复的,或者行的 ID 不是 SQL SSMS 中的某个数字,则更新列