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

datum kontingenční tabulky mysql (data svisle na vodorovnou)

Chcete-li získat tento výsledek, budete chtít otočit data. MySQL nemá funkci pivot, ale můžete použít agregační funkci s CASE výraz.

Pokud je znám počet dat, můžete dotaz napevno zadat:

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

Viz SQL Fiddle s ukázkou

Implementoval jsem uživatelské proměnné pro přiřazení čísla řádku každému záznamu v rámci client_id skupina.

Pokud máte neznámý počet dat, budete muset použít připravený příkaz k dynamickému vytvoření 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;

Viz SQL Fiddle s ukázkou .

Oba dávají výsledek:

| 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. Jak jsou data uložena v Oracle?

  2. Implementace MySQL s CUDA

  3. Prázdná databáze v MySQL a PHP?

  4. Jak získat první řádek na skupinu v PostgreSQL