Mysql
 sql >> Baza danych >  >> RDS >> Mysql

zapytanie o poziomy układ danych mysql

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Railsy `gdzie` na czas krótszy niż zapytania

  2. 10 powodów, aby trzymać się MySQL

  3. Laravel - Nieprawidłowy numer parametru:parametr nie został zdefiniowany

  4. Jak wyeksportować bazę danych mysql za pomocą wiersza polecenia?

  5. Eksportowanie tabeli mysql do pliku .txt lub .doc przy użyciu PHP