【问题标题】:How can i sum amount group by book_id and order_id我如何按 book_id 和 order_id 对金额组求和
【发布时间】:2023-11-29 10:19:01
【问题描述】:

我有一张桌子:

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?

【问题讨论】:

  • 为什么会有重复记录?如果您有额外记录 a/d1/12 会怎样?

标签: mysql sql sum


【解决方案1】:

给定当前数据,您将基于 DISTINCTSUM

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,并且它们会被压缩为一个值。

【讨论】:

  • 只有第一个有效。别人错了,不工作。
  • 它们在逻辑上是相同的,但我添加了 order_id 过滤,因为 OP 在问题中使用了该逻辑。
  • @Rezu 是的。只是一个错字。
  • @Rezu 太累了。当然,OP 正在过滤的是 book_id。
【解决方案2】:

有两种方法。第一个是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;

【讨论】:

    【解决方案3】:

    试试这个嵌套的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      
    

    【讨论】:

    • 根据您的查询,总和是 100,而不是 60。
    • @basha04 我编辑了我的答案,结果现在是正确的。
    • 如果您添加另一个值,例如 d1/20,它将不起作用。您应该将其更改为:SELECT book_id, SUM(amount) AS sum` FROM (SELECT distinct book_id, order_id, amount FROM book ) AS a;`
    【解决方案4】:
       SELECT DISTINCT(book_id), SUM(amount) FROM table GROUP BY book_id WHERE book_id ='a';
    

    【讨论】: