Krzysztof Białkowski

Krzysztof Białkowski Software Developer
(C# .NET)

Temat: [MySQL] Kolumny na rzędy

Witam!
Mam taki mały problem...
Chcialbym zamienić wynik zapytania z

A B C D
0 1 2 3

na

A 0
B 1
C 2
D 3

czyli jak zamnieć kolumny na rzędy ?
Klauzura union all odpada niestety bo zapytanie jest dosyć rozbudowane.Krzysztof Białkowski edytował(a) ten post dnia 23.03.09 o godzinie 17:13

konto usunięte

Temat: [MySQL] Kolumny na rzędy

MySQL nie ma funkcji unpivot, więc tylko tyle unionów ile kolumn


select A from tabela
union all
select B from tabela
union all
select C from tabela
union all
select D from tabela
Krzysztof Białkowski

Krzysztof Białkowski Software Developer
(C# .NET)

Temat: [MySQL] Kolumny na rzędy

Jak napisałem union odpada bo po drodze idzie pare joinów i niestety za długo by wszystko trwało.Krzysztof Białkowski edytował(a) ten post dnia 23.03.09 o godzinie 17:18

konto usunięte

Temat: [MySQL] Kolumny na rzędy

to wrzuć dane do tabeli pomocniczej i dopiero na tym rób unioma
Andrzej Koman

Andrzej Koman Manager
Bankowość/IT/ERP

Temat: [MySQL] Kolumny na rzędy

Albo przekręć monitor o 90 stopni ;-)
Przemysław Krygier

Przemysław Krygier Specjalista Systemów
Informatycznych

Temat: [MySQL] Kolumny na rzędy

Witam

Rozwiązania są różne
(
a) pivoty (chociaż chyba nie w mysql),
b) własne funkcje - rozszerzenia języka (znowu nie mysql?),
c) sprytne zapytanie (np. uproszczenie głównego zapytania poprzez odpowiednie widoki, procedury itd.)
itd.
)
... ale czasem ciemno pod latarnią ... zatem:
cóż stoi na przeszkodzie, aby wydobyte w nietransponowanej postaci dane przetworzyć w wyższej warstwie aplikacji?

Pozdrawiam

konto usunięte

Temat: [MySQL] Kolumny na rzędy

Przemysław Krygier:
... ale czasem ciemno pod latarnią ... zatem:

Albo robić to w dwóch krokach.

Najpierw insert a,b,c,d, into jakas_pomocnicza_tabela;

A potem union z tej tabeli.

Ale kolumn wiele nie ma przecież ...
Krzysztof Białkowski

Krzysztof Białkowski Software Developer
(C# .NET)

Temat: [MySQL] Kolumny na rzędy

mysql> select * from ABCD2;
+-------+------+
| param | wart |
+-------+------+
| A | 0 |
| B | 1 |
| C | 2 |
| D | 3 |
+-------+------+
4 rows in set (0.00 sec)

mysql> select max(if(param='A',wart,null)) as A,max(if(param='B',wart,null)) as
B , max(if(param='C',wart,null)) as C,max(if(param='D',wart,null)) as D from ABCD2;

+------+------+------+------+
| A | B | C | D |
+------+------+------+------+
| 0 | 1 | 2 | 3 |
+------+------+------+------+
1 row in set (0.00 sec)

Jest to jakieś rozwiązanie , co prawda w drugą stronę : )Krzysztof Białkowski edytował(a) ten post dnia 29.03.09 o godzinie 23:37
Grzegorz G.

Grzegorz G. ASE / Systems
Architect, Syniverse

Temat: [MySQL] Kolumny na rzędy

Można się połączyć z czymś n-wierszowym (n to ilość kolumn, czyli 4 w tym wypadku) i w zależności od numeru wiersza wybierać kolumnę 1, 2, 3 lub 4:

select case y.i when 1 then x.a when 2 then x.b when 3 then x.c when 4 then x.d else null end
from (Twoje skomplikowane zapytanie) x,
(select 1 as i (from dual? nie wiem jak to w mysql się pisze)
union all
select 2
union all
select 3
union all
select 4
) y
Marcin K.

Marcin K. Programowanie jest
moim powołaniem,
Alleluja

Temat: [MySQL] Kolumny na rzędy

jeśli chcesz konwersję zrobić na warstwie bazy danych to założyć trzeba tabele w przestrzeni MEMORY i na niej wykonywać operację, będzie szybciej niż na wyższej warstwie modelu. No i jest dodatkowy plus tego rozwiązania jeśli masz dużo zapytań tego typu to jak już jest taka tabela utworzona i są w niej dane odpytywanie trwa błyskawicznie, a tabelę w MOMERY np aktualizujesz co 5-10 minut jeśli zachodzą częste zmiany.Marcin K. edytował(a) ten post dnia 05.04.09 o godzinie 16:53

Następna dyskusja:

MySQL - JOINy i kolumny o t...




Wyślij zaproszenie do