Potrzebujesz zapytania Pivot. Ponieważ MySQL nie ma takiej instrukcji, musisz napisać ją „odręcznie” (a dokładniej, utworzyć dynamiczne wyrażenie SQL):
Może to wyglądać tak:
-- 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;
Proszę zobacz ten przykład w skrzypcach SQL .
Wyjaśnienie
Możesz powiedzieć „Stary, to wygląda dość skomplikowane!”... ale to wcale nie jest skomplikowane (jest po prostu pracochłonne). Jak działa powyższe rozwiązanie?
Pierwszym krokiem jest zbudowanie listy kolumn i wyrażenia do jej wypełnienia. Funkcja group_concat() Funkcja pobierze wartości wierszy (lub wyrażenia) i połączy je, oddzielając je przecinkami. Potrzebujesz funkcji agregującej, aby pokazać wartości w wyniku tabeli przestawnej. Wybrałem max() jako przykład, ale możesz użyć sum() , average() lub jakakolwiek inna funkcja agregująca.
Co do przypadku case ... end
kawałek wewnątrz funkcji agregującej, musisz, aby każda kolumna tabeli przestawnej odpowiadała wartości del_productID , więc na przykład case when del_ProductID = 1 then del_id end zwróci wartość del_id tylko jeśli del_ProductID wynosi 1 (zwróci null w każdym innym przypadku możesz dodać else 0 na przykład jeśli chcesz zwrócić zero).
select ... into
zapisze wynik wyrażenia w zmiennej o nazwie @sql .
Po zbudowaniu listy kolumn musisz napisać resztę select instrukcja... robi się to za pomocą concat() funkcja.
Reszta jest całkiem prosta:@sql jest ciągiem znaków, więc jeśli chcesz go wykonać, musisz utworzyć przygotowaną instrukcję, używając jej wartości (która jest select oświadczenie) i wykonaj go.