382 Stimmen

Wie kann ich die Ausgabe einer Pivot-Tabelle in MySQL zurückgeben?

Wenn ich eine MySQL-Tabelle habe, die etwa so aussieht:

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

Ist es möglich, eine MySQL-Abfrage auszuführen, um eine Ausgabe wie diese zu erhalten:

company\_name    EMAIL   PRINT 1 pages   PRINT 2 pages   PRINT 3 pages
-------------------------------------------------------------
CompanyA        0       0               1               3
CompanyB        1       1               2               0

Die Idee ist, dass pagecount kann variieren, so dass die Anzahl der Ausgabespalten dies widerspiegeln sollte, eine Spalte für jede action / pagecount Paar und dann die Anzahl der Treffer pro company_name . Ich bin mir nicht sicher, ob dies eine Pivot-Tabelle genannt wird, aber jemand hat das vorgeschlagen?

19voto

Talha Punkte 1376

Die richtige Antwort ist:

select table_record_id,
group_concat(if(value_name='note', value_text, NULL)) as note
,group_concat(if(value_name='hire_date', value_text, NULL)) as hire_date
,group_concat(if(value_name='termination_date', value_text, NULL)) as termination_date
,group_concat(if(value_name='department', value_text, NULL)) as department
,group_concat(if(value_name='reporting_to', value_text, NULL)) as reporting_to
,group_concat(if(value_name='shift_start_time', value_text, NULL)) as shift_start_time
,group_concat(if(value_name='shift_end_time', value_text, NULL)) as shift_end_time
from other_value
where table_name = 'employee'
and is_active = 'y'
and is_deleted = 'n'
GROUP BY table_record_id

10voto

Peter Green Punkte 127

Es gibt ein Tool namens MySQL Pivot-Tabellen-Generator, mit dem Sie eine webbasierte Pivot-Tabelle erstellen können, die Sie später in Excel exportieren können (wenn Sie möchten). Es kann funktionieren, wenn Ihre Daten in einer einzigen Tabelle oder in mehreren Tabellen sind.

Sie müssen lediglich die Datenquelle der Spalten (es werden dynamische Spalten unterstützt), die Zeilen, die Werte im Tabellenkörper und die Tabellenbeziehung (falls vorhanden) angeben. MySQL Pivot Table

Die Startseite dieses Tools lautet https://mysqlreports.com/mysql-reporting-tools/mysql-pivot-table/

4voto

irba Punkte 41
select t3.name, sum(t3.prod_A) as Prod_A, sum(t3.prod_B) as Prod_B, sum(t3.prod_C) as    Prod_C, sum(t3.prod_D) as Prod_D, sum(t3.prod_E) as Prod_E  
from
(select t2.name as name, 
case when t2.prodid = 1 then t2.counts
else 0 end  prod_A, 

case when t2.prodid = 2 then t2.counts
else 0 end prod_B,

case when t2.prodid = 3 then t2.counts
else 0 end prod_C,

case when t2.prodid = 4 then t2.counts
else 0 end prod_D, 

case when t2.prodid = "5" then t2.counts
else 0 end prod_E

from 
(SELECT partners.name as name, sales.products_id as prodid, count(products.name) as counts
FROM test.sales left outer join test.partners on sales.partners_id = partners.id
left outer join test.products on sales.products_id = products.id 
where sales.partners_id = partners.id and sales.products_id = products.id group by partners.name, prodid) t2) t3

group by t3.name ;

0voto

Barbaros Özhan Punkte 46975

Eine Möglichkeit wäre Kombination Verwendung von CASE..WHEN Anweisung ist überflüssig innerhalb einer Aggregation für die MySQL-Datenbank, und unter Berücksichtigung der erforderlichen Dynamische Abfragegenerierung zusammen mit den richtigen Spaltentitel erhalten für die Ergebnismenge wie im folgenden Codeblock:

SET @sql = NULL;

SELECT GROUP_CONCAT(
             CONCAT('SUM( `action` = ''', action, '''',pc0,' ) AS ',action,pc1)
       )
  INTO @sql
  FROM 
  ( 
   SELECT DISTINCT `action`, 
          IF(`pagecount` IS NULL,'',CONCAT('page',`pagecount`)) AS pc1,
          IF(`pagecount` IS NULL,'',CONCAT(' AND `pagecount` = ', pagecount, '')) AS pc0
     FROM `tab` 
    ORDER BY CONCAT(action,pc0) 
  ) t;

SET @sql = CONCAT('SELECT company_name,',@sql,' FROM `tab` GROUP BY company_name'); 
SELECT @sql; 

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

<a href="https://dbfiddle.uk/?rdbms=mysql_5.7&amp;fiddle=2e8e5cebf48de257c3709de4e46ce0a5" rel="nofollow noreferrer">Demo</a>

0voto

SurajSingh444 Punkte 11
SELECT company_name, SUM(CASE WHEN ACTION = 'Email' THEN 1 ELSE 0 END) AS "Email",
SUM(CASE WHEN ACTION = 'Print' AND pagecount = 1 THEN 1 ELSE 0 END) AS "print 1 PAGE",
SUM(CASE WHEN ACTION = 'Print' AND pagecount = 2 THEN 1 ELSE 0 END) AS "print 2 PAGE",
SUM(CASE WHEN ACTION = 'Print' AND pagecount = 3 THEN 1 ELSE 0 END) AS "print 2 PAGE"
FROM test1 GROUP BY company_name;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X