Alias w funkcji agregującej

0

W jaki sposób mogę posortować wynik zapytania według aliasu, w zagnieżdżonym warunku z wykorzystaniem funkcji agregującej?

Mam zapytanie, które sortuje wg. col_type i col_min / col_max (w zależności od col_type).

SELECT MAX(CASE
               WHEN attr = 10 THEN value
           END) AS col_type,
       MAX(CASE
               WHEN attr = 20 THEN value
           END) AS col_min,
       MAX(CASE
               WHEN attr = 30 THEN value
           END) AS col_max
FROM TABLE
ORDER BY col_type,
         CASE WHEN MAX(CASE
                           WHEN attr = 10 THEN value
                       END) = 1 THEN MAX(CASE
                                             WHEN attr = 20 THEN value
                                         END) 
         CASE WHEN MAX(CASE
                           WHEN attr = 10 THEN value
                       END) = 2 THEN MAX(CASE
                                             WHEN attr = 30 THEN value
                                         END) 

Chcę dodać jeszcze sortowanie według col_max dla przypadku gdy col_type jest równe 1.

SELECT MAX(CASE
               WHEN attr = 10 THEN value
           END) AS col_type,
       MAX(CASE
               WHEN attr = 20 THEN value
           END) AS col_min,
       MAX(CASE
               WHEN attr = 30 THEN value
           END) AS col_max
FROM TABLE
ORDER BY col_type,
         CASE WHEN MAX(CASE
                           WHEN attr = 10 THEN value
                       END) = 1 THEN (MAX(CASE
                                             WHEN attr = 20 THEN value
                                         END), MAX(CASE
                                             WHEN attr = 30 THEN value
                                         END))
         CASE WHEN MAX(CASE
                           WHEN attr = 10 THEN value
                       END) = 2 THEN MAX(CASE
                                             WHEN attr = 30 THEN value
                                         END) 

Nie działa, zgłasza błąd:

Operand should contain 1 column (s).

Najlepiej by to było zrobić aliasami np.:

SELECT MAX(CASE
               WHEN attr = 10 THEN value
           END) AS col_type,
       MAX(CASE
               WHEN attr = 20 THEN value
           END) AS col_min,
       MAX(CASE
               WHEN attr = 30 THEN value
           END) AS col_max
FROM TABLE
ORDER BY col_type,
         CASE WHEN MAX(CASE
                           WHEN attr = 10 THEN value
                       END) = 1 THEN (col_min, col_max)
         CASE WHEN MAX(CASE
                           WHEN attr = 10 THEN value
                       END) = 2 THEN MAX(CASE
                                             WHEN attr = 30 THEN value
                                         END) 

Tutaj także nie przejdzie, wyrzuca:

Reference col_min, col_max not supported.

Da się coś takiego uzyskać w mysql?
Czy to zbyt ubogi język na takie działania?

0

Ale że jak?
Wynika zapytania zawierający JEDEN wiersz chcesz sortować?

0
Marcin.Miga napisał(a):

Ale że jak?
Wynika zapytania zawierający JEDEN wiersz chcesz sortować?

Tam są jeszcze joiny porobione.
Jest to kontynuacja zadania stąd: Nowa kolumna w tabeli po zastosowaniu join

0

To daj pełne zapytanie, albo chociaż podobne, a nie takie z d...

0

Dodałem kilka rekordów.
3 ostatnie zapytania są już moje.

3 od dołu: Nie wiem dlaczego nie sortuje mi dla type = 1 (lokalnie mi to śmiga)
2 ostatnie odwzorowują błędy, które napisałem w pierwszym poście.

Chcę sortować względem type i:

  • max_value (gdy type = 1)
  • max_value, min_value (gdy type = 2)
  • min_value (gdy type = 3).

https://dbfiddle.uk/?rdbms=mysql_5.6&fiddle=866029d068b3057497b5f2655c596384

1

Coś w ten deseń...
https://dbfiddle.uk/?rdbms=mysql_5.6&fiddle=0879e67f3bc5f344ce6bc06b774918ca
Dwóch ierwszych chyba nie sortuje dobrze. Ale to MySQL, więc...

0
Wiara czyni cuda napisał(a):

Dodałem kilka rekordów.
3 ostatnie zapytania są już moje.

3 od dołu: Nie wiem dlaczego nie sortuje mi dla type = 1 (lokalnie mi to śmiga)
2 ostatnie odwzorowują błędy, które napisałem w pierwszym poście.

Chcę sortować względem type i:

  • max_value (gdy type = 1)
  • max_value, min_value (gdy type = 2)
  • min_value (gdy type = 3).

https://dbfiddle.uk/?rdbms=mysql_5.6&fiddle=866029d068b3057497b5f2655c596384

W ORDER BY jak najbardziej możesz użyć aliasów na kolumna.

Problem polega na bym że podając sortowanie raz próbowałeś wymienić jedną kolumna a raz dwa w zależności tego jakie było type, ale dla Col_type musisz mogąc pełna funkcje a nie alias.

Musisz użyć czegoś takiego

...
FROM TABLE
ORDER BY

--pierwsza kolumna po której sortujesz
CASE 
     WHEN MAX(CASE  WHEN attr = 10 THEN value END) = 3     THEN  min_value
     ELSE max_value
END,

--druga kolumna po której sortujesz , tak samo jak dla pierwszej za wyjątkiem gdy type=2 
CASE 
     WHEN MAX(CASE  WHEN attr = 10 THEN value END) = 1  THEN  max_value
     ELSE min_value
END
 

Z tym że w warunkach Od razu zastosowałem dodatkową logike;P

1 użytkowników online, w tym zalogowanych: 0, gości: 1