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

Jak automatizovat dotazy na kontingenční tabulky v MySQL

Kontingenční tabulky usnadňují analýzu dat a získání užitečných trendů. Možná však budete muset zautomatizovat dotazy kontingenční tabulky, abyste je často používali. Protože MySQL nemá funkci pro vytváření kontingenčních tabulek, musíte napsat SQL dotaz pro automatizaci kontingenčních tabulek v MySQL. Pojďme se tedy podívat na to, jak automatizovat dotazy kontingenční tabulky v MySQL

Jak automatizovat dotazy na kontingenční tabulky v MySQL

Zde jsou kroky k automatizaci dotazů kontingenční tabulky v MySQL. Řekněme, že máte následující tabulku

CREATE TABLE Meeting
(
    ID INT,
    Meeting_id INT,
    field_key VARCHAR(100),
    field_value VARCHAR(100)
);

INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (1, 1,'first_name' , 'Alec');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (2, 1,'last_name' , 'Jones');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (3, 1,'occupation' , 'engineer');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (4,2,'first_name' , 'John');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (5,2,'last_name' , 'Doe');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (6,2,'occupation' , 'engineer');

+------+------------+------------+-------------+
| ID   | Meeting_id | field_key  | field_value |
+------+------------+------------+-------------+
|    1 |          1 | first_name | Alec        |
|    2 |          1 | last_name  | Jones       |
|    3 |          1 | occupation | engineer    |
|    4 |          2 | first_name | John        |
|    5 |          2 | last_name  | Doe         |
|    6 |          2 | occupation | engineer    |
+------+------------+------------+-------------+

Řekněme, že chcete tabulku otočit podle zkoušky sloupec tak, aby se vytvořil 1 řádek pro každé id_schůzky a 1 sloupec pro každý klíč_pole, jak je uvedeno níže.

+------------+-------------+-------------+-------------+
| Meeting_id | first_name  |  last_name  |  occupation |
+------------+-------------+-------------+-------------+
|          1 |       Alec  | Jones       | engineer    |
|          2 |       John  | Doe         | engineer    |
+------------+-------------+-------------+-------------+

Automatizujte dotazy na kontingenční tabulky

Pokud již znáte počet sloupců, které mají být vytvořeny, můžete vytvořit dotazy na kontingenční tabulku pomocí příkazu CASE a vytvořit kontingenční tabulku.

Mnohokrát však neznáte sloupce, které potřebujete vytvořit v kontingenčních tabulkách. V takových případech můžete dynamicky vytvářet kontingenční tabulky pomocí následujícího dotazu.

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when exam = ''',
      exam,
      ''' then field_value end) ',
      field_key
    )
  ) INTO @sql
FROM
  Meeting;
SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' 
                  FROM Meeting 
                   GROUP BY Meeting_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Ve výše uvedených příkazech vám GROUP_CONCAT umožňuje zřetězit hodnoty field_key z více řádků do jednoho řetězce. Ve výše uvedeném dotazu používáme GROUP_CONCAT k dynamickému vytváření příkazů CASE na základě jedinečných hodnot ve sloupci field_key a uložení do proměnné @sql, která se pak použije k vytvoření našeho výběrového dotazu. Pomáhá vám tedy automatizovat dotazy na kontingenční tabulky v MySQL

+------------+------------+-----------+------------+
| Meeting_id | first_name | last_name | occupation |
+------------+------------+-----------+------------+
|          1 | Alec       | Jones     | engineer   |
|          2 | John       | Doe       | engineer   |
+------------+------------+-----------+------------+

Nyní, když víte, jak automatizovat dotazy kontingenční tabulky v MySQL, můžete je upravit podle svých požadavků přidáním klauzule WHERE nebo JOINS.

Pokud chcete jako sloupce pivotovat pouze vybrané hodnoty řádků, můžete do prvního příkazu select GROUP_CONCAT přidat klauzuli WHERE.

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when field_key = ''',
      field_key,
      ''' then field_value end) ',
      field_key
    )
  ) INTO @sql
FROM
  Meeting
WHERE <condition>;

Pokud chcete ve své konečné kontingenční tabulce filtrovat řádky, můžete do příkazu SET přidat klauzuli WHERE.

SET @sql = CONCAT('SELECT Meeting_id, ', @sql, ' 
                  FROM Meeting WHERE <condition>
                   GROUP BY Meeting_id');

Podobně můžete také použít JOINS ve svém dotazu SQL, zatímco dynamicky transponujete řádky do sloupců v MySQL.

Dotazy kontingenční tabulky můžete automatizovat pomocí nástroje pro vytváření sestav. Zde je příklad automatické kontingenční tabulky vytvořené pomocí Ubiq.

Věděli jste, že v Ubiq můžete vytvářet kontingenční tabulky pouhým přetažením?

Pokud chcete vytvářet kontingenční tabulky, grafy, dashboardy a sestavy z databáze MySQL, můžete zkusit Ubiq. Nabízíme 14denní bezplatnou zkušební verzi.

  1. Chyba odhadu mohutnosti dílčího dotazu

  2. Začínáme s MariaDB pomocí Docker, Java Spring a JDBC

  3. SQL Chybějící pravá závorka v pořadí po příkazu

  4. Proč iterace přes velký Django QuerySet spotřebovává obrovské množství paměti?