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

dotaz na horizontální rozložení dat mysql

Co potřebujete, je kontingenční dotaz. Protože MySQL pro to nemá příkaz, budete jej muset napsat "ručně" (přesněji vytvořit dynamický SQL výraz):

Takže to může být něco takového:

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

Prosím viz tento příklad v SQL housle .

Vysvětlení

Možná si řeknete „ty vole, to vypadá docela složitě!“... ale složité to vůbec není (jen je to pracné). Jak tedy funguje výše uvedené řešení?

Prvním krokem je vytvoření seznamu sloupců a výrazu, který jej vyplní. group_concat() funkce převezme hodnoty řádků (nebo výrazy) a zřetězí je a oddělí je čárkami. K zobrazení hodnot ve výsledku kontingenční tabulky potřebujete agregační funkci. Vybral jsem max() jako příklad, ale můžete použít sum() , average() nebo jakoukoli jinou agregační funkci.

Pokud jde o případ case ... end část uvnitř agregační funkce, musíte, aby každý sloupec kontingenční tabulky odpovídal hodnotě del_productID , takže například case when del_ProductID = 1 then del_id end vrátí hodnotu del_id pouze pokud del_ProductID je 1 (vrátí null v každém jiném případě můžete přidat else 0 pokud chcete vrátit například nulu).

select ... into uloží výsledek výrazu do proměnné nazvané @sql .

Po vytvoření seznamu sloupců musíte napsat zbytek select příkaz... to se provádí pomocí concat() funkce.

Pokud jde o zbytek, je to docela přímočaré:@sql je řetězec, takže pokud jej chcete provést, musíte vytvořit připravený příkaz pomocí jeho hodnoty (což je select příkaz) a spusťte jej.




  1. MariaDB LOCALTIME() Vysvětleno

  2. Jedinečné omezení Oracle a jedinečný index

  3. Obnovení SQL Server 2017

  4. Funkce CHARTOROWID() v Oracle