Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

consulta para layout horizontal de dados mysql


O que você precisa é de uma consulta Pivot. Como o MySQL não possui uma instrução para isso, você precisará escrevê-la "à mão" (mais exatamente, crie uma expressão SQL dinâmica):

Então, pode ser algo assim:
-- 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;

Por favor, veja este exemplo no violino SQL .

A explicação

Você pode dizer "cara, isso parece bastante complexo!"... mas não é nada complexo (é apenas trabalhoso). Então, como funciona a solução acima?

O primeiro passo é construir a lista de colunas e uma expressão para preenchê-la. O group_concat() A função pegará valores de linha (ou expressões) e os concatenará, separando-os por vírgulas. Você precisa de uma função agregada para mostrar os valores no resultado da tabela dinâmica. Eu escolhi max() como exemplo, mas você pode usar sum() , average() ou qualquer outra função agregada.

Quanto ao caso case ... end peça dentro da função agregada, você precisa que cada coluna da tabela dinâmica corresponda ao valor de del_productID , então, por exemplo, case when del_ProductID = 1 then del_id end retornará o valor de del_id somente se del_ProductID é 1 (retornará null em qualquer outro caso, você pode adicionar else 0 se você quiser retornar zero, por exemplo).

O select ... into irá armazenar o resultado da expressão em uma variável chamada @sql .

Depois de criar a lista de colunas, você precisa escrever o restante do select declaração... isso é feito com o concat() função.

Quanto ao resto, é bastante simples:@sql é uma string, então se você quiser executá-la, você precisa criar uma instrução preparada usando seu valor (que é um select instrução) e executá-lo.