sql >> Database teknologi >  >> RDS >> Mysql

forespørgsel til vandret layout af mysql-data

Det du har brug for er en Pivot-forespørgsel. Da MySQL ikke har en erklæring til det, bliver du nødt til at skrive den "i hånden" (mere præcist, opret et dynamisk SQL-udtryk):

Så det kan være noget som dette:

-- 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;

se dette eksempel i SQL violin .

Forklaringen

Du kan sige "fyr, det her ser ret komplekst ud!"... men det er slet ikke komplekst (det er bare besværligt). Så hvordan virker ovenstående løsning?

Det første trin er at bygge kolonnelisten og et udtryk til at udfylde den. group_concat() funktion vil tage rækkeværdier (eller udtryk) og sammenkæde dem, adskille dem med kommaer. Du skal bruge en aggregeret funktion for at vise værdierne i resultatet af pivottabellen. Jeg valgte max() som et eksempel, men du kan bruge sum() , average() eller enhver anden samlet funktion.

Med hensyn til case ... end stykke inde i den samlede funktion, skal du have, at hver kolonne i pivottabellen matcher værdien af ​​del_productID , så f.eks. case when del_ProductID = 1 then del_id end returnerer værdien af ​​del_id kun hvis del_ProductID er 1 (vil returnere null i alle andre tilfælde kan du tilføje else 0 hvis du for eksempel vil returnere nul).

select ... into vil gemme resultatet af udtrykket i en variabel kaldet @sql .

Når du har bygget kolonnelisten, skal du skrive resten af ​​select sætning... det er gjort med concat() funktion.

Hvad angår resten, er det ret ligetil:@sql er en streng, så hvis du vil udføre den, skal du oprette en forberedt sætning ved hjælp af dens værdi (som er en select sætning), og udfør den.




  1. Ret "FEJL:mangler FROM-klausulindtastning for tabel" i PostgreSQL, når du bruger UNION, EXCEPT eller INTERSECT

  2. MySQL-skemastørrelse

  3. TypeError:'int'-objekt understøtter ikke indeksering

  4. CHAR() Eksempler i MySQL