Domanda

Diciamo che il mio rapporto è così

enter image description here

e volevo ordinare per grado, ma prima A e B.Quindi la mia relazione sarà simile

enter image description here

All'inizio ho provato ad avere solo due relazioni, dove le ordino entrambe per rango, quindi unisco le due relazioni, ma finiscono per confondersi insieme.Ho anche provato a utilizzare i casi, ma non capisco come funziona.Continuavo a ricevere errori nel mescolare caratteri con numeri interi.

Modificare:Ho dimenticato di dire che la prima relazione di cui sopra è ciò che ottengo dopo un numero piuttosto complesso di visualizzazioni.Ad esempio, ho creato due visualizzazioni, una che ha solo le classi A e B, quindi l'ho ordinata per rango.La seconda visualizzazione riguarda solo le classi C, ordinate per grado.Poi li ho uniti, ma si sono semplicemente mescolati.

È stato utile?

Soluzione

Hai solo bisogno di un'espressione CASE nel ORDER BY, per dividere le righe in due gruppi, quindi quelli con classe 'A' o 'B' sono inseriti in primo gruppo (1) e tutti gli altri nel secondo (2):

ORDER BY 
    CASE WHEN class IN ('A', 'B') THEN 1 ELSE 2 END,
    rank ;
.

Altri suggerimenti

Ti darò un esempio di come farlo, in cui utilizzo i CTE, che sono disponibili in molti database, in particolare PostgreSQL con cui ho più familiarità.

CTE e il WITH clausola

CTE ti consente di formare strutture temporanee come tabelle a query singola, ma poiché puoi fare in modo che le CTE si affidino l'una all'altra in una singola query, fornisce un modo comodo e di facile comprensione per rendere la tua query semi-procedurale.

Nel tuo caso, ci proverei

WITH AB_results AS(
  SELECT class, rank, 1 AS hidden_rank
  FROM my_relation
  WHERE class IN ('A','B')
),
Non_AB_results AS(
  SELECT class, rank, 2 AS hidden_rank
  FROM my_relation
  WHERE class NOT IN ('A','B')
)
SELECT COALESCE(AB_results.class,Non_AB_results.class), rank
FROM AB_results
FULL OUTER JOIN Non_AB_results
USING(hidden_rank,rank)
ORDER BY hidden_rank, rank;

Proverò a mettere insieme un SQLFiddle tra un paio di minuti qui, solo per assicurarmi di non aver sbagliato alcune delle mie query.:P

MODIFICARE:Ho fatto un piccolo errore.Mentre parliamo, provo a ripulirlo con un esempio.

MODIFICA 2:L'errore è ora corretto!Sfortunatamente, SQLFiddle sta avendo qualche problema in questo momento, ma QUI è il collegamento a SQLFiddle per alcuni test.

notare che che potrei non aver risolto questo problema nel modo più elegante possibile, ma dovrebbe risolvere i tuoi problemi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top