MySQL - 将 1 列中的数据分成 3 个单独的列以生成报告

MySQL - Separating data within 1 column into 3 separate columns for a report

我们有一份报告来跟踪我们的销售代表进行了多少次编辑。当前用于提取所有 3 个页面上的编辑次数的查询如下。以前我们不关心他们在哪个页面上进行编辑,但现在我们想看看他们在哪些页面上进行了这些编辑。

我们希望在报告中显示 3 个不同的列:bhns、hns、chns,并且需要修改此查询以显示不同的列。因此,根据页面将 1 列 (customer_edits) 拆分为 3 列。

SELECT
  count( `database2`.`sales_edits`.`id` ) AS `customer_edits`,
  `database2`.`sales_edits`.`rep` AS `rep`

FROM
  `database2`.`sales_edits` 
WHERE
  ((
      cast( `database2`.`sales_edits`.`date` AS date ) = curdate()) 
    AND ((
        `database2`.`sales_edits`.`page` = 'chs' 
        ) 
      OR ( `database2`.`sales_edits`.`page` = 'chns' ) 
    OR ( `database2`.`sales_edits`.`page` = 'bhns' ))) 
GROUP BY
  `database2`.`sales_edits`.`rep` 

sales_edit table:

您似乎需要条件聚合:

select
    rep,
    sum(page = 'chs')  customer_edits_chs,
    sum(page = 'chns') customer_edits_chns,
    sum(page = 'bhns') customer_edits_bhns
from database2.sales_edits 
where date = current_date and page in ('chs', 'chns', 'bhns')
group by rep

您的原始代码看起来更复杂,需要:

  • 无需在所有列前添加模式和 table 名称 - 无论如何,单个 table 会起作用(如果您有多个列,那么您应该使用 table 别名来缩短代码)

  • 日期转换似乎没有必要; MySQL 愉快地将 'yyyy-mm-dd' 格式的任何字符串理解为日期

  • 重复的or条件可以用in

  • 缩短
  • 可能不需要用反引号包围所有标识符,因为它们不包含特殊字符