Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I return pivot table output in MySQL?

Tags:

sql

mysql

pivot

If I have a MySQL table looking something like this:

 company_name    action  pagecount ------------------------------- Company A       PRINT   3 Company A       PRINT   2 Company A       PRINT   3 Company B       EMAIL    Company B       PRINT   2 Company B       PRINT   2 Company B       PRINT   1 Company A       PRINT   3 

Is it possible to run a MySQL query to get output like this:

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

The idea is that pagecount can vary so the output column amount should reflect that, one column for each action/pagecount pair and then number of hits per company_name. I'm not sure if this is called a pivot table but someone suggested that?

like image 940
peku Avatar asked Oct 06 '11 13:10

peku


People also ask

How do I view a pivot table in MySQL?

The best way to create a pivot table in MySQL is using a SELECT statement since it allows us to create the structure of a pivot table by mixing and matching the required data. The most important segment within a SELECT statement is the required fields that directly correspond to the pivot table structure.

Can we use PIVOT in MySQL?

A database table can store different types of data and sometimes we need to transform row-level data into column-level data. This problem can be solved by using the PIVOT() function. This function is used to rotate rows of a table into column values.

How do I extract source data from a pivot table?

Right-click a cell in the pivot table, and click PivotTable Options. On the Data tab, in the PivotTable Data section, add or remove the check mark from Save Source Data with File. Click OK.


1 Answers

This basically is a pivot table.

A nice tutorial on how to achieve this can be found here: http://www.artfulsoftware.com/infotree/qrytip.php?id=78

I advise reading this post and adapt this solution to your needs.

Update

After the link above is currently not available any longer I feel obliged to provide some additional information for all of you searching for mysql pivot answers in here. It really had a vast amount of information, and I won't put everything from there in here (even more since I just don't want to copy their vast knowledge), but I'll give some advice on how to deal with pivot tables the sql way generally with the example from peku who asked the question in the first place.

Maybe the link comes back soon, I'll keep an eye out for it.

The spreadsheet way...

Many people just use a tool like MSExcel, OpenOffice or other spreadsheet-tools for this purpose. This is a valid solution, just copy the data over there and use the tools the GUI offer to solve this.

But... this wasn't the question, and it might even lead to some disadvantages, like how to get the data into the spreadsheet, problematic scaling and so on.

The SQL way...

Given his table looks something like this:

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; 

Now look into his/her desired table:

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

The rows (EMAIL, PRINT x pages) resemble conditions. The main grouping is by company_name.

In order to set up the conditions this rather shouts for using the CASE-statement. In order to group by something, well, use ... GROUP BY.

The basic SQL providing this pivot can look something like this:

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`; 

This should provide the desired result very fast. The major downside for this approach, the more rows you want in your pivot table, the more conditions you need to define in your SQL statement.

This can be dealt with, too, therefore people tend to use prepared statements, routines, counters and such.

Some additional links about this topic:

  • 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/
like image 155
Bjoern Avatar answered Oct 03 '22 03:10

Bjoern