Mysql
 sql >> Baza danych >  >> RDS >> Mysql

data tabeli przestawnej mysql (dane od pionu do poziomu)

Aby uzyskać ten wynik, będziesz chciał obrócić dane. MySQL nie ma funkcji przestawnej, ale możesz użyć funkcji agregującej z CASE wyrażenie.

Jeśli znana jest liczba dat, możesz na stałe zakodować zapytanie:

select client_id,
  max(case when rownum = 1 then date end) Date1,
  max(case when rownum = 2 then date end) Date2,
  max(case when rownum = 3 then date end) Date3
from
(
  select client_id,
    date,
    @row:=if(@prev=client_id, @row,0) + 1 as rownum,
    @prev:=client_id 
  from yourtable, (SELECT @row:=0, @prev:=null) r
  order by client_id, date
) s
group by client_id
order by client_id, date

Zobacz SQL Fiddle z wersją demonstracyjną

Zaimplementowałem zmienne użytkownika, aby przypisać numer wiersza do każdego rekordu w client_id grupa.

Jeśli masz nieznaną liczbę dat, będziesz musiał użyć przygotowanego zestawienia, aby dynamicznie utworzyć sql:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN rownum = ',
      rownum,
      ' THEN date END) AS Date_',
      rownum
    )
  ) INTO @sql
from
(
  select client_id,
    date,
    @row:=if(@prev=client_id, @row,0) + 1 as rownum,
    @prev:=client_id 
  from yourtable, (SELECT @row:=0) r
  order by client_id, date
) s
order by client_id, date;


SET @sql 
  = CONCAT('SELECT client_id, ', @sql, ' 
           from
           (
             select client_id,
               date,
               @row:=if(@prev=client_id, @row,0) + 1 as rownum,
               @prev:=client_id 
             from yourtable, (SELECT @row:=0) r
             order by client_id, date
           ) s
           group by client_id
           order by client_id, date');

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

Zobacz Skrzypce SQL z wersją demonstracyjną .

Oboje dają wynik:

| CLIENT_ID |                          DATE_1 |                          DATE_2 |                     DATE_3 |
--------------------------------------------------------------------------------------------------------------
|         1 | February, 03 2013 00:00:00+0000 | February, 10 2013 00:00:00+0000 | May, 12 2013 00:00:00+0000 |
|         2 | February, 03 2013 00:00:00+0000 |     July, 15 2013 00:00:00+0000 |                     (null) |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Obejście w mysql dla częściowego indeksu lub filtrowanego indeksu?

  2. Błąd podczas wysyłania pakietu QUERY

  3. Gdzie powinienem przechowywać parametry połączenia z bazą danych?

  4. Jak uzyskać rekordy z ostatnich 10 minut w MySQL?

  5. Menu archiwum blogów PHP MYSQL według roku i miesiąca