Rumah > Soal Jawab > teks badan
P粉1542284832023-08-22 11:20:30
Penyelesaian saya ialah menggunakan T-SQL tanpa sebarang pivot:
SELECT CompanyName, 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 Print1Pages, SUM(CASE WHEN (action='PRINT' AND pagecount=2) THEN 1 ELSE 0 END) AS Print2Pages, SUM(CASE WHEN (action='PRINT' AND pagecount=3) THEN 1 ELSE 0 END) AS Print3Pages FROM Company GROUP BY CompanyName
P粉3669463802023-08-22 00:09:42
Ini pada asasnya jadual pangsi.
Tutorial terperinci tentang cara melaksanakan fungsi ini boleh didapati di sini: http://www.artfulsoftware.com/infotree/qrytip.php?id=78
Saya mengesyorkan membaca artikel ini dan menyesuaikan penyelesaiannya mengikut keperluan anda.
Dikemas kini
Memandangkan pautan di atas tidak lagi tersedia buat masa ini, saya merasakan keperluan untuk memberikan beberapa maklumat tambahan untuk sesiapa yang mencari jawapan kepada jadual pangsi mysql di sini. Ia mengandungi banyak maklumat, dan saya tidak akan menyalin segala-galanya di sini (apatah lagi saya tidak mahu menyalin pengetahuan mereka yang luas), tetapi saya akan memberikan beberapa cadangan tentang cara bekerja dengan jadual pangsi dalam sql, kepada The persoalan yang ditimbulkan oleh peku adalah contohnya.
Mungkin pautan akan dipulihkan tidak lama lagi, saya akan terus mengikutinya.
Kaedah hamparan...
Ramai orang hanya menggunakan alat hamparan seperti MSExcel, OpenOffice atau lain-lain untuk tujuan ini. Ini adalah penyelesaian yang sah, hanya salin data di sana dan gunakan alat yang disediakan oleh GUI untuk menyelesaikan masalah.
Tetapi...ini bukan perkara utama, malah mungkin membawa kepada beberapa kelemahan, seperti cara mengimport data ke dalam hamparan, isu penskalaan, dsb.
SQL cara...
Andaikan jam tangannya kelihatan seperti ini:
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;
Sekarang lihat jam yang dia mahukan:
company_name EMAIL PRINT 1 pages PRINT 2 pages PRINT 3 pages ------------------------------------------------------------- CompanyA 0 0 1 3 CompanyB 1 1 2 0
行(EMAIL
, PRINT x pages
)表示条件。主要分组是按company_name
dijalankan.
Untuk menetapkan syarat, ini lebih seperti menggunakan pernyataan CASE
GROUP BY
. Untuk mengumpulkan mengikut sesuatu, gunakan...GROUP BY
.
SQL asas untuk menyediakan jadual pangsi ini boleh menjadi seperti ini:
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`;
Ini sepatutnya memberikan hasil yang diinginkan dengan cepat. Kelemahan utama pendekatan ini ialah anda perlu menentukan lebih banyak syarat dalam pernyataan SQL apabila anda ingin mempunyai lebih banyak baris dalam jadual pangsi.
Ini juga boleh dikendalikan, jadi orang ramai cenderung menggunakan kenyataan, rutin, kaunter, dsb.
Beberapa pautan tambahan mengenai topik ini: