sql >> Database >  >> RDS >> Mysql

query voor horizontale lay-out van mysql-gegevens

Wat je nodig hebt is een Pivot-query. Aangezien MySQL daar geen statement voor heeft, moet je het "met de hand" schrijven (meer precies, maak een dynamische SQL-expressie):

Het kan dus zoiets zijn:

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

bekijk dit voorbeeld in SQL fiddle .

De uitleg

Je zou kunnen zeggen "kerel, dit ziet er behoorlijk ingewikkeld uit!"... maar het is helemaal niet ingewikkeld (het is gewoon omslachtig). Dus, hoe werkt de bovenstaande oplossing?

De eerste stap is het samenstellen van de kolomlijst en een expressie om deze te vullen. De group_concat() functie neemt rijwaarden (of uitdrukkingen) en voegt ze samen, gescheiden door komma's. U hebt een aggregatiefunctie nodig om de waarden in het resultaat van de draaitabel weer te geven. Ik koos max() als voorbeeld, maar u kunt sum() . gebruiken , average() of een andere verzamelfunctie.

Wat betreft de case ... end stuk binnen de aggregatiefunctie, moet u dat elke kolom van de draaitabel overeenkomt met de waarde van del_productID , dus bijvoorbeeld case when del_ProductID = 1 then del_id end retourneert de waarde van del_id alleen als del_ProductID is 1 (retourneert null in elk ander geval kunt u else 0 . toevoegen als u bijvoorbeeld nul wilt retourneren).

De select ... into slaat het resultaat van de expressie op in een variabele genaamd @sql .

Nadat je de kolomlijst hebt gemaakt, moet je de rest van de select . schrijven statement... dat wordt gedaan met de concat() functie.

Voor de rest is het vrij eenvoudig:@sql is een tekenreeks, dus als u deze wilt uitvoeren, moet u een voorbereide instructie maken met de waarde ervan (wat een select is statement) en voer het uit.




  1. Three table join met andere joins dan INNER JOIN

  2. MySQL - Betekenis van PRIMARY KEY, UNIQUE KEY en KEY wanneer ze samen worden gebruikt tijdens het maken van een tabel

  3. Hoe MariaDB Database in Debian 10 te installeren

  4. Hoe moeten ip2long geconverteerde IP's worden opgeslagen in MySQL?