Rumah > Soal Jawab > teks badan
P粉4615998452023-07-26 12:06:35
Penyelesaian saya ialah menggunakan T-SQL dan bukannya sebarang jadual pangsi:
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粉5742689892023-07-26 00:37:24
Ini pada asasnya jadual pangsi.
Tutorial terperinci tentang cara melaksanakan ini boleh didapati di sini: http://www.artfulsoftware.com/infotree/qrytip.php?id=78
Saya mengesyorkan membaca artikel ini dan menyesuaikannya dengan keperluan anda sendiri.
KEMASKINI
Memandangkan pautan di atas tidak lagi tersedia pada masa ini, saya merasakan perlu untuk memberikan beberapa maklumat tambahan untuk sesiapa yang mencari jawapan kepada Jadual Pangsi MySQL di sini. Pautan ini benar-benar mempunyai banyak maklumat, saya tidak akan menyalin semuanya (dan saya tidak mahu menyalin kekayaan pengetahuan mereka), tetapi saya akan memberi nasihat tentang cara bekerja dengan jadual pangsi dalam SQL, dengan peku Ambil soalan yang dikemukakan sebagai contoh.
Mungkin pautan akan dipulihkan tidak lama lagi, saya akan memerhatikannya.
Cara hamparan...
Ramai orang hanya menggunakan alatan seperti MSExcel, OpenOffice atau alatan hamparan lain untuk menyelesaikan tugas ini. Ini adalah penyelesaian yang sah, hanya salin data di sana dan gunakan alat yang disediakan oleh GUI untuk menyelesaikan masalah.
Tetapi...ini bukan pokok masalah, malah mungkin membawa kepada beberapa keburukan, seperti cara mengimport data ke dalam hamparan, isu kebolehskalaan, dsb.
SQL way...
Andaikan jadualnya 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 jadual jangkaan:
company_name EMAIL PRINT 1 pages PRINT 2 pages PRINT 3 pages ------------------------------------------------------------- CompanyA 0 0 1 3 CompanyB 1 1 2 0
Line (EMAIL, print x pages) adalah seperti syarat. Kumpulan utama adalah mengikut nama syarikat.
Untuk menetapkan syarat, lebih sesuai menggunakan CASE statement. Untuk mengumpulkan mengikut sesuatu, anda boleh menggunakan GROUP BY.
Pernyataan SQL asas untuk menyediakan jadual pangsi ini mungkin kelihatan 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 diingini dengan cepat. Kelemahan utama pendekatan ini ialah lebih banyak baris yang anda mahu ada dalam jadual pangsi, lebih banyak syarat yang perlu anda tentukan dalam pernyataan SQL.
Masalah ini juga boleh diselesaikan, jadi orang cenderung menggunakan kenyataan, rutin, kaunter, dll.
Berikut ialah beberapa pautan tambahan mengenai topik ini: