【问题标题】:Group_Concat with duplicatesGroup_Concat 有重复项
【发布时间】:2018-04-21 05:11:17
【问题描述】:

我最近尝试使用 GROUP_CONCAT 完成聚合,其中对于每个相似的值,我都有所有重复的项目正在查询。

根据 invoice_number 列,我想查询所有相似的项目,并将它们分组到一个字符串中。

但是,我只能检索找到的第一个值并 group_concat 它们。我真的需要根据共享相同发票号的项目数量来拥有多个相似的串联字符串。

这是我的桌子:

发票表

|item_id    |invoice_number |amount |currency|
|-----------|---------------|-------|--------|
|379406     |INV00000046    |52286  |USD     |
|567501     |INV00000046    |52286  |USD     |
|102448     |INV00000390    |0      |USD     |
|1975291    |INV00000390    |0      |USD     |
|62436      |INV00000390    |0      |USD     |
|4067502    |INV00000346    |35112  |EUR     |
|5174950    |INV00000346    |35112  |EUR     |

期望的结果

|item_id    |related items          |amount |currency|
|-----------|-----------------------|-------|--------|
|379406     |379406,567501          |52286  |USD     |
|567501     |379406,567501          |52286  |USD     |
|102448     |102448,1975291,62436   |0      |USD     |
|1975291    |102448,1975291,62436   |0      |USD     |
|62436      |102448,1975291,62436   |0      |USD     |
|4067502    |4067502,5174950        |35112  |EUR     |
|5174950    |4067502,5174950        |35112  |EUR     |

我写的查询是:

SELECT
  item_id,
  invoice_number, 
  GROUP_CONCAT(item_id) as shared_item_ids, 
  ROUND(AVG(amount)/100,2) as invoice_amount, 
  currency
FROM
  invoices    
GROUP BY 
  invoice_number, 
  currency

【问题讨论】:

    标签: mysql group-concat


    【解决方案1】:

    只需使用 invoice_number 作为键加入表即可。

    SELECT
       invoices.item_id,
       invoices.invoice_number,
       GROUP_CONCAT(related.item_id) as shared_item_ids,
       ROUND(AVG(amount)/100,2) as invoice_amount, 
       currency
    FROM invoices
    JOIN invoices related ON related.invoice_number = invoices.invoice_number
    GROUP BY invoices.item_id
    

    【讨论】:

    • 可悲的是,我得到 group_concat 每行发生两次,并且没有每个 item_id 具有相同的组合。
    • Sorry wrong group by(您需要按 item_id 分组)。
    • @rlanvin 我的回答有什么不同?
    • 非常感谢!我只是在 group_concat 中使用了 Distinct 以避免多次出现。它完美地工作:)
    【解决方案2】:

    试试这个sql,希望对你有帮助。

    SELECT invoices.item_id, 
     ROUND(AVG(invoices.amount)/100,2) AS invoice_amount,
     invoices.currency, GROUP_CONCAT(relation_table.item_id) AS related items
    FROM invoices
    LEFT JOIN invoices relation_table ON 
    relation_table.invoice_number = invoices.invoice_number
    GROUP BY invoices.item_id
    

    如果你有问题,请告诉我

    【讨论】:

    • 不幸的是,这不是我的想法。我得到的是 invoice_numbers 的 group_concat,而不是 item_ids 的 group_concat,它们共享相同的发票编号:8
    • @HeberBrandao 请立即查看
    猜你喜欢
    • 2014-12-22
    • 1970-01-01
    • 2011-06-01
    • 2015-07-14
    • 2011-12-11
    • 2012-07-14
    • 2014-11-25
    • 2021-09-24
    • 2013-11-21
    相关资源
    最近更新 更多