【问题标题】:How to group rows together in new table?如何在新表中将行分组在一起?
【发布时间】:2020-03-03 10:57:28
【问题描述】:

我正在尝试将多行组合在一起以形成一个新表。我这样做是为了找到每个客户的每种发票交付方式的计数。

我试过这段代码

CREATE TABLE new_table AS
SELECT customer_id,
(COUNT(invoice_send_method WHERE invoice_send_method='Fax' GRPUP BY(purchase_date || '_' || item_id))),
(COUNT(invoice_send_method WHERE invoice_send_method='Mail' GRPUP BY(purchase_date || '_' || item_id))),
(COUNT(invoice_send_method WHERE invoice_send_method='Email' GRPUP BY(purchase_date || '_' || item_id)))
FROM my_table;

但它在 invoice_send_method 的第一个实例之后(在 WHERE 之前)返回语法错误。

为了算作发票运输方式的一个实例,我创建了一条规则,它必须是 purchase_date 和 item_id 的唯一组合。

有没有更好的方法来做到这一点?似乎我无法在 COUNT 中引入 WHERE 或 GROUP BY 语句,但我不知道在检查所有发票交付方式的同时还能如何做。

我正在使用 MySQL Workbench。

【问题讨论】:

    标签: mysql sql sorting


    【解决方案1】:

    您的查询在语法上是错误的。
    使用这个:

    CREATE TABLE new_table AS
    SELECT 
      t.customer_id,
      SUM(t.invoice_send_method = 'Fax') fax_count,
      SUM(t.invoice_send_method = 'Mail') mail_count,
      SUM(t.invoice_send_method = 'Email') email_count
    FROM (SELECT DISTINCT * FROM my_table) AS t
    GROUP BY t.customer_id; 
    

    请参阅demo
    结果:

    | customer_id | fax_count | email_count | mail_count |
    | ----------- | --------- | ----------- | ---------- |
    | 10863865    | 0         | 1           | 0          |
    | 12010467    | 1         | 0           | 0          |
    | 2771929     | 0         | 0           | 3          |
    | 5317588     | 0         | 0           | 1          |
    | 7484618     | 0         | 3           | 0          |
    | 7924567     | 1         | 0           | 0          |
    | 9320463     | 1         | 0           | 0          |
    

    【讨论】:

    • 为什么要求和而不是计数?另外,使用 sum 是否允许我在其中插入 WHERE 子句和 GROUP BY 子句?
    • Mysql 将 invoice_send_method='Fax' 评估为 0 或 1。所以它是 1s 的总和。在您的预期结果中,我没有看到 purchase_date。您还需要按purchase_date 分组吗?
    • 这给了我一个“函数 sum(boolean) 不存在”的错误
    • 我最终尝试了 SUM(CASE WHEN t.invoice_send_method = 'Fax' THEN 1 END) 并且没有产生错误
    • 你确定你使用的是MySql吗?
    【解决方案2】:

    您可以尝试使用 ORDER BY 而不是 GROUP BY:

    CREATE TABLE new_table AS
    SELECT customer_id, purchase_date, item_id,
    COUNT(invoice_send_method WHERE invoice_send_method='Fax') as count_fax, 
    COUNT(invoice_send_method WHERE invoice_send_method='Mail') as count_mail,
    COUNT(invoice_send_method WHERE invoice_send_method='Email') as count_email,
    FROM my_table
    ORDER BY purchase_date, item_id;
    

    如果您不想看到 purchase_date 和 item_id,可以从 SELECT 中删除它们,这样测试起来更容易。

    【讨论】:

    • 据我所知,这只能解决一半。我希望将行与purchase_date 和item_id 的相同组合合并。客户 7484618 在 2019 年 10 月 17 日订购了 360 项商品 3 次,但应仅算作收到一封电子邮件
    • 在 ORDER BY 行之前尝试 'GROUP BY customer_id',应该可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多