Questa è fondamentalmente una tabella pivot.
Un bel tutorial su come raggiungere questo obiettivo può essere trovato qui: http://www.artfulsoftware.com/infotree/qrytip.php?id=78
Vi consiglio di leggere questo post e di adattare questa soluzione alle vostre esigenze.
Aggiornare
Dopo che il link qui sopra non è più disponibile, mi sento obbligato a fornire alcune informazioni aggiuntive per tutti voi alla ricerca di risposte pivot mysql qui. Aveva davvero una grande quantità di informazioni e non inserirò tutto da lì (anche di più, dato che non voglio copiare la loro vasta conoscenza), ma darò alcuni consigli su come gestire il pivot tabelle in modo sql generalmente con l'esempio di peku che ha posto la domanda in primo luogo.
Forse il link ritorna presto, lo terrò d'occhio.
Il modo di foglio di calcolo ...
Molte persone usano solo uno strumento come MSExcel, OpenOffice o altri strumenti per fogli di calcolo a questo scopo. Questa è una soluzione valida, basta copiare i dati laggiù e utilizzare gli strumenti offerti dalla GUI per risolverlo.
Ma ... questa non era la domanda, e potrebbe anche portare ad alcuni svantaggi, come come ottenere i dati nel foglio di calcolo, ridimensionamento problematico e così via.
Il modo SQL ...
Dato che il suo tavolo è simile al seguente:
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;
Ora guarda nella sua tabella desiderata:
company_name EMAIL PRINT 1 pages PRINT 2 pages PRINT 3 pages
-------------------------------------------------------------
CompanyA 0 0 1 3
CompanyB 1 1 2 0
Le righe ( EMAIL
, PRINT x pages
) assomigliano alle condizioni. Il gruppo principale è di company_name
.
Al fine di impostare le condizioni, questo grida piuttosto per l'utilizzo della CASE
dichiarazione. Al fine di gruppo da qualcosa, beh, l'uso ... GROUP BY
.
L'SQL di base che fornisce questo perno può assomigliare a questo:
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`;
Questo dovrebbe fornire il risultato desiderato molto velocemente. Il principale svantaggio di questo approccio, più righe vuoi nella tua tabella pivot, più condizioni devi definire nell'istruzione SQL.
Anche questo può essere affrontato, quindi le persone tendono ad usare dichiarazioni preparate, routine, contatori e simili.
Alcuni link aggiuntivi su questo argomento: