Bagaimana untuk melaksanakan output jadual pangsi dalam MySQL
P粉481035232
P粉481035232 2023-08-21 16:06:24
0
2
552
<p>Jika saya mempunyai jadual MySQL seperti ini:</p> <pra>bilangan halaman tindakan nama_syarikat ---------------------------------- CETAKAN SYARIKAT 3 CETAKAN SYARIKAT 2 CETAKAN SYARIKAT 3 Syarikat BEMAIL Syarikat B CETAKAN 2 Syarikat B CETAKAN 2 SYARIKAT B CETAKAN 1 CETAKAN SYARIKAT 3 </pra> <p>Adakah mungkin untuk menjalankan pertanyaan MySQL untuk mendapatkan output berikut: </p> <pra>nama_syarikat CETAK EMEL 1 halaman CETAK 2 halaman CETAK 3 halaman ------------------------------------------------- ---------- SyarikatA 0 0 1 3 SyarikatB 1 1 2 0 </pra> <p>Ideanya ialah <code>pagecount</code> boleh berbeza-beza, jadi bilangan lajur dalam output harus mencerminkannya, satu untuk setiap <code>action</code>/<code>pagecount< lajur ;/kod>, kemudian bilangan klik untuk setiap <kod>nama_syarikat</kod>. Saya tidak pasti sama ada ini dipanggil jadual pangsi, tetapi adakah sesiapa yang mencadangkan ini? </p>
P粉481035232
P粉481035232

membalas semua(2)
P粉154228483

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粉366946380

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 KESCASE语句。为了按某个东西进行分组,使用...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:

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan