mysql - 多列交叉制表又名枢轴

标签 mysql sql pivot

我学习和练习sql大约有6个月了。我已经准备好投入并承认我对此很愚蠢,而且我的大脑无法理解它的大多数模式。我正在尝试创建一个数据透视表。关于这个主题的简单文献并不多,我找到的唯一一个来源谈到了创建多维数据集和基本的实体属性值 (EAV) 逻辑。无论这意味着什么。

name        action  pagecount
-------------------------------
Company A   PRINT    3
Company A   PRINT    2
Company A   PRINT    3
Company B   EMAIL    6
Company B   PRINT    2
Company B   PRINT    2
Company B   PRINT    1
Company A   PRINT    3

我想对name列与action列的总计数和pagecount<列的总计数进行交叉制表(这是正确的术语吗?)/

 name        action_PRINT   action_EMAIL       pagecount_PRINT      pagecount_EMAIL
--------------------------------------------------------------------------------
Company A   4                0                 11                       0
Company B   3                1                 5                        6

最佳答案

这种类型的操作称为PIVOT,但 MySQL 没有枢轴函数,因此您需要使用聚合函数和 CASE 语句来复制它.

您可以使用以下内容来生成结果:

select name,
  sum(case when action = 'PRINT' then 1 else 0 end) action_print,
  sum(case when action = 'EMAIL' then 1 else 0 end) action_email,
  sum(case when action = 'PRINT' then pagecount else 0 end) pagecount_print,
  sum(case when action = 'EMAIL' then pagecount else 0 end) pagecount_email
from yourtable
group by name

参见SQL Fiddle with Demo

结果将是:

|      NAME | ACTION_PRINT | ACTION_EMAIL | PAGECOUNT_PRINT | PAGECOUNT_EMAIL |
-------------------------------------------------------------------------------
| Company A |            4 |            0 |              11 |               0 |
| Company B |            3 |            1 |               5 |               6 |

关于mysql - 多列交叉制表又名枢轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13696613/

相关文章:

mysql - SQL 跟踪器记录表中的更改

mysql - 是否可以在数据透视表和另一个表之间创建一个有很多关系?

python - Pandas 对数据透视表中的值进行排序

php - 在php mysql中使用 "CASE WHEN ... THEN"时错误查询值为空?

MySQL 确定用户是否在 X 天内登录

mysql - 如何从表格列中选择 4 位数字的组合?

sql - 在 SQL 中转置列和行的简单方法?

MySQL,等于还是不等于?

php - 由于位数不同,sql 表中的时间查询不正确

mysql - SQL 两个表的左连接