Mysql
 sql >> база данни >  >> RDS >> Mysql

заявка за хоризонтално оформление на mysql данни

Това, от което се нуждаете, е 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 изявление) и го изпълнете.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете съхранена процедура в MySQL

  2. свържете се с локален MySQL сървър чрез сокет

  3. Опитвайки се да инсталирате Perl-Mysql DBD, mysql_config не може да бъде намерен

  4. Използване на променливи в MySQL UPDATE (PHP/MySQL)

  5. Увеличете полето на базата данни с 1