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.