MySQL-将1列中的数据分成3个独立的报表列

问题描述 投票:1回答:1

我们有一个报告来跟踪销售代表进行的编辑数量。下面是用于拉取所有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表:

sales_edit table

mysql sql group-by pivot report
1个回答
0
投票

看来您需要条件聚合:

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

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

  • 无需在所有列之前添加模式和表名-无论如何,一个表都会起作用(如果您有多个表,则应使用表别名来缩短代码)]]

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

  • 重复的or条件可以通过in缩短

  • 可能不需要将所有标识符都用反引号引起来,尽管它们不包含特殊字符

© www.soinside.com 2019 - 2024. All rights reserved.