SORU
6 EKİM 2011, PERŞEMBE


MySQL pivot tablo

Eğer MySQL bir tablo isteyen varsa şöyle bir şey:

company_name    action  pagecount
-------------------------------
Company A       PRINT   3
Company A       PRINT   2
Company A       PRINT   3
Company B       EMAIL   
Company B       PRINT   2
Company B       PRINT   2
Company B       PRINT   1
Company A       PRINT   3

Bu gibi: çıktı almak için bir MySQL sorgusu çalıştırmak mümkün

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

Fikri pagecount çıkış sütun sayısı, sütun company_namebaşına isabetaction/pagecount çift ve daha sonra her numara için yansıtmalıdır kadar değişebilir. Bu Özet Tablo denir ama biri önerdi emin değilim?

CEVAP
6 EKİM 2011, PERŞEMBE


Temelde bubir Özet Tablo.

Bu bulunabilir burada elde etmek için nasıl iyi bir öğretici: http://www.artfulsoftware.com/infotree/queries.php#78

Okuma bu yazı tavsiye ediyorum ve ihtiyaçlarınıza göre bu çözüm, uyum.

Güncelleme

Sonra yukarıdaki linki mevcut artık hepiniz için bazı ek bilgiler sağlamak için burada mysql pivot cevap ararken kendimi sorumlu tutuyorum. Bu gerçekten çok büyük bir miktar bilgi ve yapmayacağım koymak her şeyi oradan buraya (daha beri istemedim kopyala kendi engin bilgi), ama vereceğim bir tavsiye üzerine nasıl davranılması pivot tablolar sql genellikle yolu ile örnek peku kim sordu bu soruyu.

Belki de bağlantı hemen geri geliyor, bir göz atarım.

Tablo gibi

Birçok kişi sadece Microsoft gibi bir aracı ya da bu amaçla çizelge-OpenOffice diğer araçları kullanın. Bu geçerli bir çözüm, sadece veri kopyalama ve araçlar bunu çözmek için GUI teklif kullanın.

Ama... bu bir soru değil, ve hatta bazı dezavantajları, elektronik tabloya veri almak için nasıl bir neden olabilir, sorunlu Ölçekleme.

SQL gibi

Masasının verilen şöyle görünür:

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;

Şimdi çevirmek istediğiniz masasına bak

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

Satır (,* EMAIL *12) koşulları benzer. Ana gruplandırma company_name.

Koşulları ayarlamak için bu oldukça CASE-deyimi kullanmak için bağırıyor. Bir grup için ... GROUP BY kullanın.

Temel SQL bu pivot sağlayan böyle bir şey bakabilirsiniz

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`;

Bu istenen sonucu çok hızlı sağlamalıdır. Bu yaklaşımın en büyük dezavantajı, istediğiniz Özet Tablo, daha fazla satır koşullar SQL deyimi tanımlamak gerekir.

Bu insanlar hazır deyimler, rutinleri, ve bu tür sayaçları kullanma eğiliminde bu nedenle de ele alınabilir.

Bu konu hakkında bazı ek bağlantılar:

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alan Fullmer

    Alan Fullmer

    3 EYLÜL 2010
  • Philip DeFranco

    Philip DeFra

    16 EYLÜL 2006
  • steeletraining

    steeletraini

    28 NİSAN 2010