2011-07-15 5 views
3

Tableau tempgroupe SQL Server par problème de requête d'état

ID Status 
1 completed 
2 approved 
3 paid 
4 cancel 
5 approved 
6 paid 

Je veux afficher au-dessus recored selon le tableau ci-dessous sans utiliser union.because c'est l'exigence du client, donc s'il vous plaît fournir une aide à cet effet.

Tableau température

ID Status 
1 completed 
2 approved 
5 approved 
3 paid 
6 paid 
4 cancel 

Répondre

1

Presque identique à la réponse de Dan, mais pour SQL Server (ou les normes du système de base de données SQL):

SELECT 
    ID, 
    Status 
FROM 
    temp 
ORDER BY 
    CASE Status 
     WHEN 'completed' THEN 1 
     WHEN 'approved' THEN 2 
     WHEN 'paid' THEN 3 
     WHEN 'cancel' THEN 4 
    END 

Autres préoccupations -

1) Le titre de cette question semble être trompeuse, car il n'y a pas t à propos de la clause GROUP BY, et,

2) Je pense que vous avez une idée fausse à propos UNION aussi - il n'y a aucune garantie de l'ordre dans lequel les résultats seront de retour d'un UNION ou UNION ALL - Dans le cas UNION, il y a probable être une opération de tri pour aider le serveur à éliminer les doublons, mais quel tri est effectué est entièrement à la hauteur du serveur et vous ne devriez pas compter sur un tel tri toujours nécessaire. Pour un UNION ALL, imaginez si la première requête est une grande requête, nécessitant beaucoup d'E/S, et la deuxième requête est triviale (par exemple, toutes les données requises sont déjà en mémoire). Une optimisation évidente pour le serveur consiste à renvoyer les résultats de la deuxième requête alors qu'il effectue toujours des E/S pour le premier.

+0

remercie mon ami fonctionne bien. –

1

Puisque vous essayez de commander les lignes de façon arbitraire, vous pouvez utiliser une déclaration CASE dans la clause ORDER BY. Voici un exemple de travail qui vous donnera la sortie que vous recherchez (pour SQL Server):

DECLARE @myTable AS TABLE([ID] INT, [Status] VARCHAR(16)) 
INSERT INTO @myTable VALUES(1, 'completed') 
INSERT INTO @myTable VALUES(2, 'approved') 
INSERT INTO @myTable VALUES(3, 'paid') 
INSERT INTO @myTable VALUES(4, 'cancel') 
INSERT INTO @myTable VALUES(5, 'approved') 
INSERT INTO @myTable VALUES(6, 'paid') 

SELECT * 
FROM @myTable 
ORDER BY 
    CASE [ID] 
     WHEN 1 THEN 1 
     WHEN 2 THEN 2 
     WHEN 3 THEN 4 
     WHEN 4 THEN 5 
     WHEN 5 THEN 3 
     WHEN 6 THEN 6 
     ELSE 999 
    END 
0
select ID, 
     [Status] 
from Temp 
order by case [Status] 
      when 'completed' then 1 
      when 'approved' then 2 
      when 'paid'  then 3 
      when 'cancel' then 4 
      else 5 
     end, ID 
+0

merci mon ami fonctionne très bien. –