Mysql
 sql >> Database >  >> RDS >> Mysql

query per il layout orizzontale dei dati MySQL

Ciò di cui hai bisogno è una query Pivot. Poiché MySQL non ha un'istruzione per questo, dovrai scriverla "a mano" (più esattamente, creare un'espressione SQL dinamica):

Quindi, potrebbe essere qualcosa del genere:

-- First you need to build the column list.
-- The "CASE ... END" expression will filter the data for each column
-- I use "max()" as an example; use whatever aggregate function you need.
select
  group_concat(distinct
    concat(
      'max(case when del_ProductID = ', del_productID, ' then del_id end) ',
      'as `del_productID-', del_productID, '` '
    )
  )
into @sql
from example;

-- Now build the full SELECT statement
set @sql = concat('SELECT del_date, ', @sql, ' from example group by del_date');


-- OPTIONAL: Check the SELECT statement you've just built
select @sql;

-- Prepare a statement using the SELECT statement built above
prepare stmt from @sql;
execute stmt;

-- When you are done, be sure to dealocate the prepared statement
deallocate prepare stmt;

Per favore vedi questo esempio in SQL fiddle .

La spiegazione

Potresti dire "amico, sembra piuttosto complesso!"... ma non è affatto complesso (è solo laborioso). Quindi, come funziona la soluzione di cui sopra?

Il primo passo è costruire l'elenco delle colonne e un'espressione per riempirlo. Il group_concat() funzione prenderà i valori di riga (o espressioni) e li concatenerà, separandoli da virgole. È necessaria una funzione di aggregazione per mostrare i valori nel risultato della tabella pivot. Ho scelto max() come esempio, ma puoi usare sum() , average() o qualsiasi altra funzione aggregata.

Per quanto riguarda il case ... end pezzo all'interno della funzione di aggregazione, è necessario che ogni colonna della tabella pivot corrisponda al valore di del_productID , quindi, ad esempio, case when del_ProductID = 1 then del_id end restituirà il valore di del_id solo se del_ProductID è 1 (restituirà null in ogni altro caso, puoi aggiungere else 0 se vuoi restituire zero, ad esempio).

Il select ... into memorizzerà il risultato dell'espressione in una variabile chiamata @sql .

Dopo aver creato l'elenco delle colonne, devi scrivere il resto del select istruzione... questo è fatto con concat() funzione.

Per il resto, è abbastanza semplice:@sql è una stringa, quindi se vuoi eseguirla, devi creare un'istruzione preparata usando il suo valore (che è un select istruzione) ed eseguirlo.