当前位置: 首页 > 面试题库 >

如何在MySQL中返回数据透视表输出?

司马越
2023-03-14
问题内容

如果我有一个看起来像这样的MySQL表:

company_name操作页数
-------------------------------
公司A打印3
公司A打印2
公司A打印3
公司B电子邮件   
公司B打印2
公司B打印2
公司B打印1
公司A打印3

是否可以运行MySQL查询以获取如下输出:

company_name EMAIL打印1页打印2页打印3页
-------------------------------------------------- -----------
公司A 0 0 1 3
公司B 1 1 2 0

这个想法pagecount可能会有所不同,因此输出列的数量应反映出这一点,每列action/
pagecount对对应一列,然后每列的匹配数company_name。我不确定这是否称为数据透视表,但有人建议这样做吗?


问题答案:

这基本上 数据透视表。

可以在此处找到有关如何实现此目标的不错的教程:http
:
//www.artfulsoftware.com/infotree/qrytip.php?id=78

我建议阅读这篇文章,并根据您的需求调整此解决方案。

更新资料

在上面的链接当前不可用之后,我不得不为在此搜索mysql枢轴答案的所有人提供一些其他信息。它确实具有大量信息,我不会在这里放置所有内容(甚至因为我不想复制他们的大量知识而在这里提供了更多信息),但是我将提供一些有关如何处理数据透视的建议通常以首先问问题的peku的示例来表述sql方式。

也许链接很快回来,我会密切注意的。

电子表格方式…

为此,许多人只是使用MSExcel,OpenOffice或其他电子表格工具之类的工具。这是一个有效的解决方案,只需将数据复制到那里,然后使用GUI提供的工具即可解决此问题。

但这不是问题,甚至可能导致一些不利因素,例如如何将数据输入电子表格,难以解决的缩放等。

SQL方式…

鉴于他的桌子看起来像这样:

CREATE TABLE `test_pivot` (
  `pid` bigint(20) NOT NULL AUTO_INCREMENT,
  `company_name` varchar(32) DEFAULT NULL,
  `action` varchar(16) DEFAULT NULL,
  `pagecount` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`pid`)
) ENGINE=MyISAM;

现在查看他/她想要的表:

company_name    EMAIL   PRINT 1 pages   PRINT 2 pages   PRINT 3 pages
-------------------------------------------------------------
CompanyA        0       0               1               3
CompanyB        1       1               2               0

行(EMAILPRINT x pages)类似的条件。主要分组为company_name

为了设置条件,这CASE很想使用-
statement。为了GROUP BY的东西,好,使用… GROUP BY

提供此枢纽的基本SQL可能如下所示:

SELECT  P.`company_name`,
    COUNT(
        CASE 
            WHEN P.`action`='EMAIL' 
            THEN 1 
            ELSE NULL 
        END
    ) AS 'EMAIL',
    COUNT(
        CASE 
            WHEN P.`action`='PRINT' AND P.`pagecount` = '1' 
            THEN P.`pagecount` 
            ELSE NULL 
        END
    ) AS 'PRINT 1 pages',
    COUNT(
        CASE 
            WHEN P.`action`='PRINT' AND P.`pagecount` = '2' 
            THEN P.`pagecount` 
            ELSE NULL 
        END
    ) AS 'PRINT 2 pages',
    COUNT(
        CASE 
            WHEN P.`action`='PRINT' AND P.`pagecount` = '3' 
            THEN P.`pagecount` 
            ELSE NULL 
        END
    ) AS 'PRINT 3 pages'
FROM    test_pivot P
GROUP BY P.`company_name`;

这应该很快提供期望的结果。这种方法的主要缺点是,数据透视表中需要的行越多,则需要在SQL语句中定义的条件越多。

这也可以解决,因此人们倾向于使用准备好的语句,例程,计数器等。

有关此主题的一些其他链接:

  • http://anothermysqldba.blogspot.de/2013/06/pivot-tables-example-in-mysql.html
  • http://www.codeproject.com/Articles/363339/Cross-Tabulation-Pivot-Tables-with-MySQL
  • http://datacharmer.org/downloads/pivot_tables_mysql_5.pdf
  • https://codingsight.com/pivot-tables-in-mysql/


 类似资料:
  • 问题内容: 什么是在php / MySQL中处理数据透视表的最佳方法(或达到这种效果的方法) 我有一个查询,返回的信息如下 我想用PHP建立一个报表,该报表按每周开始的列标题按组进行计数。例如 但是我不确定从哪里开始,因为标题是动态的,具体取决于报表运行的月份。 我知道如何传递月份的详细信息并检索PHP中的所有数据,但是当前它只输出到一列中,而不是能够分组并放入数组中。 任何帮助表示赞赏! 问题答

  • 问题内容: 我试图获得一个带有动态列的数据透视表。当user_id是一个字符串时,它可以正常工作,但是如果它是一个int,那么它似乎会失败 到目前为止,在过去的问题帮助下,我得到的是: 参见:http : //sqlfiddle.com/#!2/eab24/1 我确定这很简单,但是我想念什么呢? 谢谢 问题答案: 由于值在其中,因此您要将它们设为列名,因此必须将值包装在反引号中 该SQL将看起来像

  • 问题内容: 我有两个表三元组和标签 三元组表具有以下列 标签表具有以下列 我正在尝试编写sql创建带有动态标题的数据透视表 输出应该是这样的 编写SQL的任何帮助将不胜感激。我在网上看到了示例,但无法弄清楚这一示例 问题答案: 为了 转动 在MySQL中的数据,您需要同时使用聚合函数和表达。 如果您知道已知的列数,则可以对查询进行硬编码: 参见带有演示的SQL Fiddle 但是,如果您的列数未知

  • 这是我从查询中得到的结果 输出 但我想

  • 问题内容: 我的MySQL数据库具有以下列标题: 我有兴趣根据typeOfWork和月份显示结果。例如,所有typeOfWork条目将显示在左侧的第一列中,并且每个字段将在每一列的指定月份总计该特定typeOfWork。因此,我的SQL数据透视表语句当前为: 我目前遇到语法错误,指定了最后一行(从’DEC到ROLLUP’)。我感到困惑的原因是,我只是从脚本中的另一个工作枢轴表改编了该表。我认为差异

  • A 数据透视表介绍 B.1 什么是数据透视表? 数据透视表是一种可以快速汇总、分析大量数据表格的交互式工具。使用数据透视表可以按照数据表格的不同字段从多个角度进行透视,并建立交叉表格,用以查看数据表格不同层面的汇总信息、分析结果以及摘要数据。使用数据透视表可以深入分析数值数据,以帮助用户发现关键数据,并做出有关企业中关键数据的决策。 数据透视表是针对以下用途特别设计的:以友好的方式,查看大量的数据