如果行中的初始值在 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    |
+-----------------+---------------+---------+

我该怎么做呢?

【问题讨论】:

&lt;&gt;0 怎么样,&lt;0&gt;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 中的某个数字,则更新列

sql 示例:如果行存在,则如何更新行或如​​果行不存在则插入行

参数值在 Ajax 中为空?

如果行存在于另一个表中,如何更新 (SQL)

如何在全范围内平均减少 SQL 查询的结果行?