sql >> Databáze >  >> RDS >> Mysql

Jak mohu vrátit výstup kontingenční tabulky v MySQL?

Toto v podstatě je kontingenční tabulka.

Pěkný návod, jak toho dosáhnout, najdete zde:http:// www.artfulsoftware.com/infotree/qrytip.php?id=78

Doporučuji přečíst si tento příspěvek a přizpůsobit toto řešení svým potřebám.

Aktualizovat

Poté, co výše uvedený odkaz v současné době již není k dispozici, cítím povinnost poskytnout některé další informace pro vás všechny, kteří zde hledají odpovědi na pivot mysql. Bylo v něm opravdu obrovské množství informací a nebudu sem dávat vše odtamtud (o to víc, protože nechci kopírovat jejich rozsáhlé znalosti), ale dám vám pár rad, jak se vypořádat s pivotem tabulky způsobem sql obecně s příkladem z peku, který položil otázku jako první.

Možná se odkaz brzy vrátí, budu na to dávat pozor.

Tabulkový způsob...

Mnoho lidí k tomuto účelu používá pouze nástroj jako MSExcel, OpenOffice nebo jiné tabulkové procesory. Toto je platné řešení, stačí tam zkopírovat data a použít nástroje, které GUI nabízí.

Ale... to nebyla otázka a dokonce to mohlo vést k určitým nevýhodám, jako je způsob, jak dostat data do tabulky, problematické škálování a tak dále.

Cesta SQL...

Vzhledem k tomu, že jeho tabulka vypadá asi takto:

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;

Nyní se podívejte do jeho/její požadované tabulky:

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

Řádky (EMAIL , PRINT x pages ) podobají podmínkám. Hlavní seskupení je podle company_name .

Za účelem nastavení podmínek to spíše volá po použití CASE -prohlášení. Chcete-li seskupit podle něčeho, použijte ... GROUP BY .

Základní SQL poskytující tento pivot může vypadat nějak takto:

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

To by mělo poskytnout požadovaný výsledek velmi rychle. Hlavní nevýhodou tohoto přístupu je, že čím více řádků chcete v kontingenční tabulce, tím více podmínek musíte definovat v příkazu SQL.

I to se dá řešit, proto lidé mají tendenci používat připravené příkazy, rutiny, počítadla a podobně.

Některé další odkazy k tomuto tématu:



  1. jak zapsat číslo do funkce word na serveru SQL

  2. Jak nainstalovat balíček Python na Linux tak, aby byl nalezen již fungujícím rozšířením PostgreSQL 13 plpython3u?

  3. Samostatný server MySQL

  4. Jak se připojit k databázi pomocí klienta NaviCat MySQL