我如何按 book_id 和 order_id 对金额组求和

How can i sum amount group by book_id and order_id

我有一个 table:

book_id  order_id  amount
-------- -------   -------
   a      d1         10
   a      d1         10
   a      d1         10
   a      d2         20
   a      d2         20
   a      d3         30

我试试这个

SELECT book_id,sum(amount) as sum FROM table WHERE book_id= 'a' GROUP BY book_id;

结果

book_id      sum
--------   -------
   a         100

但我想按 book_id 对它们进行分组,并像这样

book_id      sum
--------   -------
   a         60     ==> d1+d2+d3

如何将 mySQL 写入 SUM 行,如 d1+d2+d3?

试试这个嵌套 SELECT

SELECT book_id, SUM(amount) AS `sum` FROM (SELECT DISTINCT book_id, order_id, amount FROM book GROUP BY book_id, order_id) AS a;

结果

book_id  sum     
-------  --------
a        60      

鉴于当前数据,您将 SUM 基于 DISTINCT 行:

Working Test Case - Updated

全部结果:

book_id SUM(amount)
-------------------
a       60
-------------------
WITH cte AS (
       SELECT DISTINCT book_id,  order_id,  amount FROM tbl
     )
SELECT book_id
     , SUM(amount)
  FROM cte
 GROUP BY book_id
;

根据需要向 cte 项或最终查询表达式添加过滤。

WITH cte AS (
       SELECT DISTINCT book_id,  order_id,  amount
         FROM tbl
        WHERE book_id = 'a'
     )
SELECT book_id
     , SUM(amount)
  FROM cte
 GROUP BY book_id
;

对于旧版本的 MySQL,您可以使用 derived table,而不是 CTE 术语:

SELECT book_id
     , SUM(amount)
  FROM (
         SELECT DISTINCT book_id,  order_id,  amount
           FROM tbl
          WHERE book_id = 'a'
       ) AS cte
 GROUP BY book_id
;

尝试 SUM(DISTINCT amount) 是不正确的,因为一些不同的订单可能具有相同的 amount 而这些订单将被压缩为一个值。

有两种方法。第一个是 Distinct:

Select t.book_id, sum(t.amount)
from
(
   SELECT DISTINCT book_id,  order_id,  amount 
   FROM book
) t
group by t.book_id

第二个是 With:

WITH w AS (
       SELECT DISTINCT book_id,  order_id,  amount FROM book
          )
SELECT book_id, SUM(amount)
  FROM w
 GROUP BY book_id;
   SELECT DISTINCT(book_id), SUM(amount) FROM table GROUP BY book_id WHERE book_id ='a';