sql >> Databáze >  >> RDS >> Mysql

Existuje způsob, jak pivotovat řádky do sloupců v MySQL bez použití CASE?

Odkaz, který poskytl Kangkan, vám ukáže, jak toho dosáhnout, pokud jste předem znali názvy sloupců. Jdeme na stejnou logiku, s výjimkou použití dynamického SQL k vytvoření příkazu. Každé pole má 2 části, které musíte zahrnout, pole v příkazu select a vhodné spojení pro získání hodnoty...takže budeme muset příkaz sestavit ze dvou částí

Nejprve deklarujte 3 proměnné, abyste to sestavili...pro tento příklad použiji @select, @join a @sql. Dejte proměnným počáteční hodnoty

 set @select = 'select user_id,'
 set @join = 'from table t'

nyní deklarujte a načtěte kurzor s odlišnými hodnotami v poli table.key. Budu používat @field, když se proměnná vyplní odlišným polem table.key. Pak to projděte a vytvořte dvě proměnné:

 set @select = @select + ', ' + @field + '.value as '[email protected]+'
 set @join = @join + ' left join table ' + @field + 'on '[email protected]+'.key = t.key and and '[email protected]+'.user_id = t.user_id

(spojení je navrženo tak, aby používala hodnotu v @field jako alias tabulky)

procházejte kurzorem pomocí @select a @join. Na konci cyklu:

set @sql = @select + @join + 'where clause if you want'
exec @sql

Dynamické SQL vytvořené takto může být absolutní bolestí řešit problémy (a najít správné řešení) a otevřít bezpečnostní problémy... ale je to asi jediný způsob, jak toho dosáhnout. Dávejte pozor na omezení velikosti proměnných... pokud tam máte příliš mnoho různých klíčů, proměnné se příliš zvětšují. Omlouvám se, že nemohu být přesnější s pseudonymem... zjistíte, že vytváření dynamického SQL v SQL je pracné.




  1. Mysql – Jak provést vyhledávání rozlišující malá a velká písmena?

  2. FUNKCE DROP bez znalosti počtu/typu parametrů?

  3. Chyba MySQL #2014 – Příkazy nejsou synchronizované; tento příkaz nyní nemůžete spustit

  4. Existuje nějaká hashovací funkce v PL/SQL?