Krzysztof Białkowski

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

Temat: [Mysql] Horizontal to vertical

Hej!
Krótka piła. Mam taki result

mysql> select * from test where id_rekordu=1;
+------------+----------+----------+---------------------+
| id_rekordu | wartosc1 | wartosc2 | data_insert |
+------------+----------+----------+---------------------+
| 1 | a | b | 2010-07-27 00:05:40 |
+------------+----------+----------+---------------------+


I teraz chciałbym coś w stylu (to sie chyba jakoś fachowo nawet nazywa)

| key | value |
| wartosc1 | a |
| wartosc2 | b |
| data_insert | 2010-07-27 00:05:40 |


Ktoś ma jakiś pomysł jak można to w miare sensownie rozwiązać ? (o ile w ogóle się da)
pozdrawiam
Krzysztof Bokiej

Krzysztof Bokiej Software Engineer

Temat: [Mysql] Horizontal to vertical

Krzysztof Białkowski:
Hej!
Krótka piła. Mam taki result

mysql> select * from test where id_rekordu=1;
+------------+----------+----------+---------------------+
| id_rekordu | wartosc1 | wartosc2 | data_insert |
+------------+----------+----------+---------------------+
| 1 | a | b | 2010-07-27 00:05:40 |
+------------+----------+----------+---------------------+

I teraz chciałbym coś w stylu (to sie chyba jakoś fachowo nawet nazywa)

| key | value |
| wartosc1 | a |
| wartosc2 | b |
| data_insert | 2010-07-27 00:05:40 |

Ktoś ma jakiś pomysł jak można to w miare sensownie rozwiązać ? (o ile w ogóle się da)
pozdrawiam


Skorzystaj z UNION. Pozdrawiam.
Paweł W.

Paweł W. java developer at
https://rozwoj-oprog
ramowania.pl

Temat: [Mysql] Horizontal to vertical

Poszukaj frazy: "mysql pivot".
Ja ostatnio potrzebowalem czegos podobnego, lecz dla innej bazy - napisalem procedure, ktora mi transponuje zrodlowa tabele na docelowa (przeksztalca wiersze w kolumny)
Krzysztof Białkowski

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

Temat: [Mysql] Horizontal to vertical

Krzysztof Bokiej:
Skorzystaj z UNION. Pozdrawiam.
No właśnie UNION mi średnio podchodzi. Chciałbym aby w momencie dodania, nowej kolumny do tabeli, zapytanie je automatycznie uwzględniało.
Paweł Wtorek:
Poszukaj frazy: "mysql pivot".
Chyba do końca to nie jest ;) (raczej unpivot). Pivot z tego co tam kojarze zamienia wiersze w kolumny, a ja potrzebuje odwrotnie. (jak się mylę to proszę o korekte ;) Nazwa w każdym razie jest tu najmniej istotna.

Może przybliżę dokładniej o co mi chodzi:

Mam dwa zapytania które zwracają powiedzmy cechy jakieś osoby:
Pierwsze zapytanie zwraca dane w postaci :


+------------+----------+----------+---------------------+
| id_rekordu | wartosc1 | wartosc2 | data_insert |
+------------+----------+----------+---------------------+
| 1 | a | b | 2010-07-27 00:05:40 |
+------------+----------+----------+---------------------+


Natomiast drugie :


+---------------+-----------------+---------+
| id_rekordu | nazwa | wartosc |
+---------------+-----------------+---------+
| 1 | numer_buta | 32 |
| 1 | numer_kolnierzy | 12 |
+---------------+-----------------+---------+


Najwygodniej byłoby pierwsze przekształcić w format drugiego i połączyć oba unionem.


+---------------+-----------------+---------+
| id_rekordu | nazwa | wartosc |
+---------------+-----------------+---------+
| 1 | wartosc2 | b |
| 1 | wartosc1 | a |
| 1 | numer_buta | 32 |
| 1 | numer_kolnierzy | 12 |
+---------------+-----------------+---------+


Z przekształceniem drugiego w format pierwszego nie ma dużego problemu (pivot),ale też nie jest do końca najwygodniejsze a pozatym chyba w takim formacie nie skleję obu zapytań ze sobą.

Mogę ewentualnie przerobić pierwsze zapytanie na union, ale to też średniawka gdyż z każdym dodaniem nowej kolumny muszę modyfikować też zapytanie.

Da się to w ogóle jakoś machnąć w mysql ? Czy takie rzeczy tylko w erze :)Krzysztof Białkowski edytował(a) ten post dnia 27.07.10 o godzinie 10:20
Paweł W.

Paweł W. java developer at
https://rozwoj-oprog
ramowania.pl

Temat: [Mysql] Horizontal to vertical

tak jak wspomnialem, napisz procedure, ktora Ci przeksztalci tabele w inna - wiersze w kolumny (niezaleznie od tego ile bedziesz miec nowych kolumn, dynamicznie bedzie zamieniac)
Krzysztof Białkowski

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

Temat: [Mysql] Horizontal to vertical

Paweł Wtorek:
Poszukaj frazy: "mysql pivot".
Ja ostatnio potrzebowalem czegos podobnego, lecz dla innej bazy - napisalem procedure, ktora mi transponuje zrodlowa tabele na docelowa (przeksztalca wiersze w kolumny)

Ale jak później połącze result z procedury i selecta ? (bez użycia jakiegoś języka zewnętrznego)Krzysztof Białkowski edytował(a) ten post dnia 27.07.10 o godzinie 10:36
Paweł W.

Paweł W. java developer at
https://rozwoj-oprog
ramowania.pl

Temat: [Mysql] Horizontal to vertical

robisz tak:
procedura bierze dane zrodlowe z Twego zapytania pierwszego. potem dokonujesz transpozycji tych danych, tworzac nowa tabele (poprzednia wersje automatycznie mozesz usuwac). W nowej tabeli tworzy sie tyle wierszy ile bylo kolumn w tabeli zrodlowej, nadawane sa jakies tam odpowiednie nazwy nowych kolumn i tyle.
Na koniec ladnie sobie poprzez union to laczysz nowa tabele po transpozycji z tym drugim select.

Ja to implementowalem w oracle, nie wiem jakie mozliwosci sa w mysql, ale zakladam ze musi sie udac.

edit:
precyzujac, musisz sobie dostosowac przetwarzanie tych danych do swojego przypadku, nalezy wziac pod uwage, ktore wartosci z wiersza wsadzic w ktore kolumny docelowePaweł Wtorek edytował(a) ten post dnia 27.07.10 o godzinie 11:09

Następna dyskusja:

Zapytanie MySQL




Wyślij zaproszenie do