如何根据另一列对值求和,减去别名

How to sum values depending on another column, substract Aliases

SQL-Noob 这里

有一堆物品,不是买就是卖。

我想按 item-name 分组并得到购买和销售的总和。 我也想计算物品的库存。

我尝试了一个子查询:

SELECT NAME,
(
    SELECT SUM(quantity)
    FROM transactions
    WHERE `type` = "Buy") AS "purchases",
(
    SELECT SUM(quantity)
    FROM transactions
    WHERE `type` = "Sell") AS "sales"
FROM transactions
GROUP BY NAME

这会导致错误的值:

之后我尝试了 CASE-Statements

SELECT NAME,
SUM(CASE WHEN `type` = "Buy" THEN quantity END) AS "purchases",
SUM(CASE WHEN `type` = "Sell" THEN quantity END) AS "sales"
FROM transactions
GROUP BY name

有效:

问题一:有没有更好的方法来达到这个结果?

问题2:如何计算商品的Stock?

purchases - sales AS "Stock" 之类的东西似乎不起作用。

非常感谢

使用条件聚合:

select name,
    sum(case when type = 'Buy'  then quantity else 0 end) as purchases,
    sum(case when type = 'Sell' then quantity else 0 end) as sales,
    sum(case when type = 'Buy'  then quantity else - quantity end) as stock
from transactions
where type in ('Buy', 'Sell')
group by name

where 子句不是必需的,因为 table 中只有那些类型。

旁注:

  • 对文字字符串使用单引号而不是双引号;这是标准 SQL,所有数据库都能理解

  • 在MySQL中,如果需要引用标识符而不是双引号,请使用反引号;或者更好的是,使用不需要引用的标识符