sql >> Databasteknik >  >> RDS >> Mysql

fråga för horisontell layout av mysql-data

Vad du behöver är en Pivot-fråga. Eftersom MySQL inte har ett uttalande för det, måste du skriva det "för hand" (mer exakt, skapa ett dynamiskt SQL-uttryck):

Så det kan vara ungefär så här:

-- 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;

Vänligen se det här exemplet i SQL-fiol .

Förklaringen

Du kanske säger "dude, det här ser ganska komplicerat ut!"... men det är inte alls komplicerat (det är bara jobbigt). Så, hur fungerar ovanstående lösning?

Det första steget är att bygga kolumnlistan och ett uttryck för att fylla den. group_concat() funktion kommer att ta radvärden (eller uttryck) och sammanfoga dem, separera dem med kommatecken. Du behöver en aggregatfunktion för att visa värdena i resultatet av pivottabellen. Jag valde max() som ett exempel, men du kan använda sum() , average() eller någon annan aggregatfunktion.

När det gäller case ... end del inuti aggregatfunktionen behöver du att varje kolumn i pivottabellen matchar värdet på del_productID , så till exempel case when del_ProductID = 1 then del_id end returnerar värdet för del_id endast om del_ProductID är 1 (kommer att returnera null i alla andra fall kan du lägga till else 0 om du till exempel vill returnera noll).

select ... into kommer att lagra resultatet av uttrycket i en variabel som heter @sql .

När du har skapat kolumnlistan måste du skriva resten av select uttalande... som görs med concat() funktion.

Vad gäller resten är det ganska okomplicerat:@sql är en sträng, så om du vill köra den måste du skapa en förberedd sats med dess värde (som är en select uttalande), och kör den.




  1. Använder du namngivna instanser? Testa din DAC-anslutning!

  2. Postgres:kontrollera om arrayfältet innehåller värde?

  3. MySQL-implementering med CUDA

  4. My 11g Optimizer Stats Job Quit on Me – Fixed