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

MySQL Pivot Table Head Scratcher

Jak již bylo zmíněno, MySQL není stavěno pro pivotování samo o sobě a pravděpodobně byste měli pivotovat v kódu, pokud je to možné, ale pokud to není možné, níže je nějaký příklad SQL, který by měl dělat to, co chcete. Za předpokladu, že vaše skutečná tabulka je v určitém smyslu proměnná (například kolik máte q[x] sloupců nebo kolik máte super_id), můžete to zabalit do uložené procedury a dynamicky generovat a spouštět potřebné SQL.

Za předpokladu počáteční tabulky s názvem testTable:

mysql> select * from testTable;
+----------+--------+------+------+
| super_id | cat_id | qa   | qb   |
+----------+--------+------+------+
|        1 |      1 |    5 |    5 | 
|        1 |      2 |    2 |    5 | 
|        1 |      3 |    3 |    4 | 
|        2 |      4 |    5 |    3 | 
|        2 |      5 |    3 |    4 | 
|        2 |      6 |    4 |    2 | 
+----------+--------+------+------+
6 rows in set (0.00 sec)

Použijte následující SQL:

SELECT
    'qa' q,
    SUM( CASE WHEN super_id = 1 THEN qa ELSE 0 END )/SUM( CASE WHEN super_id = 1 THEN 1 ELSE 0 END ) super_id_1,
    SUM( CASE WHEN super_id = 2 THEN qa ELSE 0 END )/SUM( CASE WHEN super_id = 2 THEN 1 ELSE 0 END ) super_id_2
FROM
    testTable
UNION ALL
SELECT
    'qb' q,
    SUM( CASE WHEN super_id = 1 THEN qb ELSE 0 END )/SUM( CASE WHEN super_id = 1 THEN 1 ELSE 0 END ) super_id_1,
    SUM( CASE WHEN super_id = 2 THEN qb ELSE 0 END )/SUM( CASE WHEN super_id = 2 THEN 1 ELSE 0 END ) super_id_2
FROM
    testTable
;

Chcete-li dosáhnout tohoto výsledku:

+----+------------+------------+
| q  | super_id_1 | super_id_2 |
+----+------------+------------+
| qa |     3.3333 |     4.0000 | 
| qb |     4.6667 |     3.0000 | 
+----+------------+------------+
2 rows in set (0.00 sec)

(edit:formátování)




  1. Jak získat hodnotu z adresy URL

  2. Vytvoření návratů vozíku v buňce csv pomocí php

  3. SQL:najít řádky a seřadit podle počtu odpovídajících sloupců?

  4. Sloupec 'id' v místě, kde je klauzule nejednoznačná