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

Příkaz SQL - matice SQL

Existují dva způsoby, jak můžete otočit data v MySQL. Pokud znáte hodnoty předem (týmy), pak hodnoty napevno zakódujete nebo můžete použít připravený příkaz ke generování dynamického sql.

Statická verze by byla:

select TeamA,
  max(case when TeamB = 'A' then won - lost else 0 end) as A,
  max(case when TeamB = 'B' then won - lost else 0 end) as B,
  max(case when TeamB = 'C' then won - lost else 0 end) as C,
  max(case when TeamB = 'D' then won - lost else 0 end) as D,
  max(case when TeamB = 'E' then won - lost else 0 end) as E
from yourtable
group by TeamA;

Viz SQL Fiddle s ukázkou

Pokud chcete použít dynamickou verzi s připraveným příkazem, kód by byl:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN TeamB = ''',
      TeamB,
      ''' THEN won - lost else 0 END) AS `',
      TeamB, '`'
    )
  ) INTO @sql
from
(
  select *
  from yourtable
  order by teamb
) x;

SET @sql 
  = CONCAT('SELECT TeamA, ', @sql, ' 
           from yourtable
           group by TeamA');

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

Viz SQL Fiddle s ukázkou .

Edit #1, po přemýšlení o tom bych to vlastně udělal trochu jinak. Vytvořil bych skutečnou matici z dat, kde se týmy objevily v řádku i ve sloupci. K tomu byste nejprve použili UNION ALL dotaz pro zobrazení všech týmů ve dvou sloupcích:

select teama Team1, teamb Team2,
  won-lost Total
from yourtable
union all
select teamb, teama,
  won-lost
from yourtable

Viz SQL Fiddle s ukázkou . Jakmile to uděláte, otočíte údaje:

select Team1,
  coalesce(max(case when Team2 = 'A' then Total end), 0) as A,
  coalesce(max(case when Team2 = 'B' then Total end), 0) as B,
  coalesce(max(case when Team2 = 'C' then Total end), 0) as C,
  coalesce(max(case when Team2 = 'D' then Total end), 0) as D,
  coalesce(max(case when Team2 = 'E' then Total end), 0) as E
from
(
  select teama Team1, teamb Team2,
    won-lost Total
  from yourtable
  union all
  select teamb, teama,
    won-lost
  from yourtable
) src
group by Team1;

Viz SQL Fiddle s ukázkou . Což dává podrobnější výsledek:

| TEAM1 |  A | B |  C | D | E |
-------------------------------
|     A |  0 | 2 | -2 | 8 | 0 |
|     B |  2 | 0 |  0 | 0 | 0 |
|     C | -2 | 0 |  0 | 0 | 0 |
|     D |  8 | 0 |  0 | 0 | 0 |
|     E |  0 | 0 |  0 | 0 | 0 |


  1. Rozdíl mezi tabulkovou funkcí a zřetězenou funkcí?

  2. Jak získat aktuální datum a čas (bez časového pásma) v T-SQL

  3. Rozdíly mezi MySQL a SQLite v SQL

  4. Jak vložit data skrytého pole do databáze pomocí php