mysql - 获取最近 3 个月的数据作为单独的列而不是每个用户的行

标签 mysql

我有一个 mysql 表“bf_monthly_bill”,其中存储来自另一个表“bf_users”的每个用户的数据按月存储。

我的 bf_users 表的结构是

id   | display_name
1    | ABC
2    | DEF
3    | GHI
4    | JKL

bf_monthly_bill 的结构是

company_id   | package_price  | bill_month
1            | 500            | Jan2k19
2            | 300            | Jan2k19
3            | 900            | Jan2k19
1            | 200            | Feb2k19
3            | 542            | Feb2k19
1            | 500            | Mar2k19
2            | 300            | Mar2k19
3            | 900            | Mar2k19
4            | 200            | Mar2k19

我想要每个公司名称及其每个账单月的 package_price,例如

company_name   | first_month_bill  | second_month_bill |third_month_bill 
ABC            | 500               | 200               |   500 
DEF            | 300               | 0 or Null         |   300
GHI            | 900               | 542               |   900
JKL            | 0 or NUll         | 0 or Null         |   200

我试过的是

SELECT bf_users.display_name,first_month.package_price firstt_bill,second_month.package_price second_bill,third_month.package_price third_bill from bf_monthly_bill 
AS first_month 
JOIN bf_monthly_bill AS second_month ON first_month.company_id=second_month.company_id
JOIN bf_monthly_bill AS third_month ON first_month.company_id=third_month.company_id
JOIN bf_users ON bf_users.id=first_month.company_id
Where first_month.bill_month='Jan2k19' AND second_month.bill_month='Feb2k19' AND third_month.bill_month='Mar2k19'

这个查询的问题是它只给了我每个月出现的那些公司和他们各自的账单

最佳答案

  1. 使用 LEFT JOIN 确保您获得完整的公司列表,即使没有任何月份的账单。
  2. 您必须手动或使用脚本创建 n 列。
  3. 你可以做简单的连接,不需要子查询。
  4. 使用 GROUP BY 为每个公司生成单个记录。
  5. 使用CASE WHENIF ELSE 创建n 列并仅从相关行中选取数据。它可以是第一行或任何行,因此使用聚合函数通过将其他行值设置为 NULL 作为聚合函数来排除空值,即使它位于组的任何行中也可以选择数据。
SELECT 
    u.display_name,
    SUM(IF( bill_month='Jan2k19', package_price, NULL)) as first_bill,
    SUM(IF( bill_month='Feb2k19', package_price, NULL)) as second_bill,
    SUM(IF( bill_month='Mar2k19', package_price, NULL)) as third_bill
FROM bf_users u 
LEFT JOIN bf_monthly_bill b on u.id=b.company_id
GROUP BY u.display_name;

关于mysql - 获取最近 3 个月的数据作为单独的列而不是每个用户的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57819573/

相关文章:

php - Symfony 查询学说实体

MySql "No Database selected",尽管是完全限定名称

mysql - 使用MySQL删除表中有些重复的记录

PHP PDO 不工作

mysql - 带线程的 Perl 邮件队列 'out of memory'

php - 使用php在多行中插入表单值

php - 当输入通过按键聚焦时,我想通过 ajax 发送一个值

javascript - 当第二个值设置文本时,如何在文本字段上设置总和值?

java - 在 Java Web 应用程序 servlet 中使用 MySQL 类

php - Laravel 的多个数据库配置文件