Това, от което се нуждаете, е Pivot заявка. Тъй като MySQL няма изявление за това, ще трябва да го напишете "на ръка" (по-точно, създайте динамичен SQL израз):
Така че може да е нещо подобно:
-- 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;
Моля, вижте този пример в SQL fiddle .
Обяснението
Може да кажете „пич, това изглежда доста сложно!“... но изобщо не е сложно (просто е трудоемко). И така, как работи горното решение?
Първата стъпка е да изградите списъка с колони и израз, който да го попълни. group_concat()
функцията ще приема стойности на редове (или изрази) и ще ги конкатенира, като ги разделя със запетаи. Имате нужда от агрегатна функция, за да покажете стойностите в резултата от обобщената таблица. Избрах max()
като пример, но можете да използвате sum()
, average()
или всяка друга агрегатна функция.
Що се отнася до case ... end
част вътре в агрегатната функция, трябва всяка колона на централната таблица да съответства на стойността на del_productID
, така например, case when del_ProductID = 1 then del_id end
ще върне стойността на del_id
само ако del_ProductID
е 1 (ще върне null
във всеки друг случай можете да добавите else 0
ако искате да върнете нула, например).
select ... into
ще съхранява резултата от израза в променлива, наречена @sql
.
След като сте изградили списъка с колони, трябва да напишете останалата част от select
изявление... това се прави с concat()
функция.
Що се отнася до останалото, това е доста ясно:@sql
е низ, така че ако искате да го изпълните, трябва да създадете подготвен израз, използвайки неговата стойност (която е select
изявление) и го изпълнете.