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.