Bagaimana untuk mengembalikan output jadual pangsi dalam MySQL?
P粉926174288
P粉926174288 2023-08-23 20:25:28
0
2
453
<p>Jika saya mempunyai jadual MySQL yang kelihatan 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 seperti ini: </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 kiraan lajur output harus mencerminkan ini, untuk setiap <kod>tindakan</code>/<code>pagecount</code> Untuk satu lajur, maka 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粉926174288
P粉926174288

membalas semua(2)
P粉368878176

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

Ini pada asasnya jadual pangsi.

Tutorial yang baik tentang cara melaksanakan ini boleh didapati di sini: http:///www.artfulsoftware.com/infotree/qrytip.php?id=78

Saya mengesyorkan membaca artikel ini dan menyesuaikan penyelesaian ini mengikut keperluan anda.

Dikemas kini

Selepas pautan di atas tidak lagi tersedia buat masa ini, saya merasakan keperluan untuk memberikan beberapa maklumat tambahan untuk sesiapa yang mencari di sini untuk jawapan mysql hub. Ia mempunyai banyak maklumat, saya tidak akan meletakkan semuanya di sini (atau lebih, kerana saya tidak mahu meniru pengetahuan mereka yang luas), tetapi saya akan memberikan beberapa nasihat tentang cara menangani pangsi secara umum dalam jadual Kaedah sql, mengambil peku yang mula-mula bertanya soalan sebagai contoh.

Mungkin pautan akan kembali tidak lama lagi, saya akan memerhatikannya.

Kaedah hamparan...

Ramai orang hanya menggunakan MSExcel, OpenOffice atau alat hamparan lain untuk tujuan ini. Ini adalah penyelesaian yang berfungsi, hanya salin data di sana dan gunakan alat yang disediakan oleh GUI untuk menyelesaikan masalah.

Tetapi... ini bukan masalah, malah mungkin membawa kepada beberapa keburukan seperti cara memasukkan data ke dalam hamparan, isu dengan penskalaan, dsb.

SQL cara...

Memandangkan bentuknya 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;

Lihat borang yang dia mahu sekarang:

company_name    EMAIL   PRINT 1 pages   PRINT 2 pages   PRINT 3 pages
-------------------------------------------------------------
CompanyA        0       0               1               3
CompanyB        1       1               2               0

OK (电子邮件打印 x 页)类似于条件。主要分组是按company_name.

Untuk menetapkan syarat, anda perlu menggunakan CASE-penyataan. Untuk mengumpulkan mengikut sesuatu, gunakan...KUMPULAN OLEHGROUP BY.

SQL asas untuk menyediakan 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 diinginkan dengan cepat. Kelemahan utama pendekatan ini ialah lebih banyak baris yang anda inginkan dalam Jadual Pangsi, lebih banyak syarat yang anda perlu tentukan dalam pernyataan SQL.

Ini juga boleh dikendalikan, jadi orang ramai cenderung menggunakan kenyataan, rutin, kaunter, dsb.

Beberapa pautan lain mengenai topik ini:

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