sql >> Databasteknik >  >> RDS >> Mysql

SQL-sats - SQL-matris

Det finns två sätt att pivotera data i MySQL. Om du känner till värdena i förväg (lag) kommer du att hårdkoda värdena eller så kan du använda en förberedd sats för att generera dynamisk sql.

En statisk version skulle vara:

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;

Se SQL-fiol med demo

Om du vill använda en dynamisk version med en förberedd sats, skulle koden vara:

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;

Se SQL-fiol med demo .

Edit #1, efter att ha tänkt på detta skulle jag faktiskt göra det här lite annorlunda. Jag skulle generera en sann matris för data där lagen dök upp i både raden och kolumnen. För att göra detta skulle du först använda en UNION ALL fråga för att få alla lag i två kolumner:

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

Se SQL-fiol med demo . När det är gjort, skulle du pivotera uppgifterna:

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;

Se SQL-fiol med demo . Vilket ger ett mer detaljerat resultat av:

| 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. Generera SQL Skapa skript för befintliga tabeller med Query

  2. Uppdatera fråga med LEFT JOIN , Variable och Autoincrement med MySQL

  3. Mysql:Välja värden mellan två kolumner

  4. Hur hittar man utifrån flera kriterier med Phalcon findFirst?