2014-09-08 7 views
0

J'ai donc deux colonnes (Société, Type)SQL Trier une colonne par mélange des deux Asc et Desc (Trier par Waves)

 
CompanyType 
Bell Mobile 
Rogers Mobile 
Fido Mobile 
Bell Mobile 
Bell Home 
Fido Home 
Rogers Home 
Bell Home 
Bell Home 
Rogers Home 
Fido Home 
Bell Mobile 
Bell Mobile 
Fido Mobile 
Rogers Home 
Bell Home 
Rogers Home 

Je veux qu'il ressemble

 
Bell Home 
Bell Home 
Bell Home 
Bell Home 
Bell Mobile 
Bell Mobile 
Bell Mobile 
Bell Mobile 
Fido Mobile 
Fido Mobile 
Fido Home 
Fido Home 
Rogers Home 
Rogers Home 
Rogers Home 
Rogers Home 
Rogers Mobile 

Le La première colonne est juste un tri régulier par ascendant. La deuxième colonne est un mélange des deux asc/desc. Remarquez comment le premier ensemble de Company (Bell) est trié asc, puis quand vous arrivez au second set de société (Fido), il est trié desc. Et puis quand vous arrivez au troisième ensemble, il est de retour à asc et ainsi de suite ...

Pour l'instant, je n'ai aucune idée sur la façon de trier ce type. Mais je pense que je devrais créer deux nouvelles colonnes: (CompanySortOrder, valeurs à 1 ~ 3 par rapport à chaque entreprise, puis 1,2 pour Type) Gardez à l'esprit que c'est un exemple, donc codé en dur pas possible car je m'attends à plus d'entreprises et plus le type aussi je pourrais même avoir besoin de trier une troisième colonne par la même manière ou la manière normale de trier.

Edit: Je veux aussi ajouter que le tri de la deuxième colonne, type, pourrait également commencer par Desc puis Asc et ainsi de suite

+0

strictement alternée? Comment savez-vous si la deuxième colonne devrait * commencer * à trier par ordre croissant ou décroissant? –

+0

D'abord le tri par quelle colonne, par asc ou desc ou par tri alternant (que ça commence ou asc ou desc) est dynamique – David

+0

J'ai deux listes déroulantes (la première liste est la colonne que je trier) et la liste déroulante est (par asc ou desc) et une troisième case à cocher (cela détermine si le tri sera alterné et s'il commence par asc ou desc, cela est donné par la sélection de la deuxième liste déroulante). Aussi. C'est évident que la première variable de la colonne, vous ne pouvez pas trier en alternance. Les utilisateurs pourront donc ajouter une autre variable de tri avec les conditions respectives – David

Répondre

0

Si vous utilisez MS SQL Server ou tout autre DBMS qui prend en charge les fonctions de partitionnement comme DENSE_RANK() vous pouvez accomplir cela en partitionnant les données en groupes basés sur la société et en appliquant un ordre différent selon que le groupe% 2 = 0 (c'est-à-dire s'il est pair ou impair). Il peut y avoir d'autres façons plus efficaces d'accomplir cela, mais c'est ce qui m'est venu à l'esprit en premier.

Avec une troisième colonne, il pourrait ressembler à ceci (j'Enveloppez la requête dans un CTE pour plus de clarté):

;WITH sorted AS (
    SELECT *, 
     Sort1 = DENSE_RANK() OVER (ORDER BY COMPANY) % 2, 
     Sort2 = DENSE_RANK() OVER (ORDER BY COMPANY, Type) % 2 
    FROM YourTable 
    ) 
SELECT * FROM sorted 
ORDER BY Company ASC, 
CASE Sort1 WHEN 1 THEN Type END ASC, 
CASE Sort1 WHEN 0 THEN Type END DESC, 
CASE Sort2 WHEN 0 THEN Type END ASC, 
CASE Sort2 WHEN 1 THEN Type END DESC 
+0

Incroyable, ça marche. Je ne pense jamais que ce soit une question aussi simple. Et si je devais introduire une troisième colonne, à laquelle j'ai aussi besoin de trier par alternance – David

+0

Si vous voulez ajouter une troisième colonne, vous devriez pouvoir ajouter un autre niveau de partitionnement. Je vais mettre à jour ma réponse. – jpw

+0

comme ceci: "SELECT [Société], [Type], [Fonction] FROM {Sheet1} ORDER BY Entreprise ASC, CAS (DENSE_RANK() OVER (COMMANDER PAR [Société])% 2) QUAND 1 PUIS [Type] END ASC, CAS (DENSE_RANK() OVER (COMMANDE PAR [Société])% 2) QUAND 0 PUIS [Type] END DESC, CAS (DENSE_RANK() OVER (COMMANDE PAR [Type])% 2) QUAND 1 PUIS [ Fonction] END DESC, CAS (DENSE_RANK() OVER (ORDER BY [Type])% 2) QUAND 0 PUIS [Fonction] END ASC " – David