【问题标题】:Multi Column cross tabulation AKA pivot多列交叉表 AKA 枢轴
【发布时间】:2012-12-04 18:23:32
【问题描述】:

我已经学习和练习 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

【问题讨论】:

标签: mysql sql pivot


【解决方案1】:

这种类型的操作称为 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 |

【讨论】:

  • 完美。所以 case 的行为有点务实?它将循环遍历每一行的案例并执行此操作或执行此操作?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 2021-06-25
  • 2021-09-10
相关资源
最近更新 更多