如果行中的初始值在 SQL 中为 < 或 > 0,如何 Return 分隔列的总和
How to Return Separate Sums of Columns if Initial Value in row is < or > 0 in SQL
我正在尝试编写一个 SQL 查询,该查询将 return 根据值是负数还是正数,为每个客户提供独特的装运零件号总和行。例如:
如果我们两次将 20 个零件 Z 运送给客户 A,他们 return 将 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
但是我得到错误:
Column invalid. Must be a group by column: Ship_Quantity in SELECT
LIST.
当我将“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 |
+-----------------+---------------+---------+
我该怎么做?
在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。
我正在尝试编写一个 SQL 查询,该查询将 return 根据值是负数还是正数,为每个客户提供独特的装运零件号总和行。例如:
如果我们两次将 20 个零件 Z 运送给客户 A,他们 return 将 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
但是我得到错误:
Column invalid. Must be a group by column: Ship_Quantity in SELECT LIST.
当我将“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 |
+-----------------+---------------+---------+
我该怎么做?
在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。