2010-09-21 10 views
3

Je veux un ordre spécifique pour la colonne COMPLETION_STATUS comme dans:SQL - spécifié Ordre alphabétique

, ordonnancées, incomplet & Failed

Comment puis-je commander cela? Je veux définir l'ordre ci-dessus.

J'ai essayé CASE mais il me donne une erreur comme dans Attendre NUM non CHAR.

select DISTINCT 
    u.first_name || ' ' || u.last_name "Employee_Name", 
    rco.title "Course_Name", 
    decode(p.status,'P','Passed', 'F','Failed', 'C','Completed', 'I','Incomplete', 'Not Attempted') "Completion_Status", 

    to_char(p.completed_date,'YYYY-MM-DD') "Date_Completed" 
    from 
    offering o, offering_enrollment oe, users u , performance p, offering_content_object c, content_object rco 
    where 
    o.id = oe.offering_id and 
    u.id = oe.user_id and 
    o.content_object_id = c.id AND 
    p.content_object_id = c.source_id and 
    p.content_object_id = rco.id AND 
    p.user_id(+) = u.id and 
    u.id in (select id 
        from users 
        where manager_id = $user.id$) 
        AND 
p.content_object_id NOT IN (41453457, 130020319, 43363877) 
order by 
"Employee_Name", "Completion_Status" 
+0

Quelle base de données utilisez-vous? Certains ont de meilleures installations pour cela que d'autres, donc ça aide de savoir. – Oded

+0

C'est une base de données Oracle 9i. –

Répondre

3

Edit: Je suppose que maintenant vos données de base est le seul omble chevalier ...

order by decode(p.status,'P',1,'F',2,'C',3,'I',4) 
6

Vous pourrez peut-être utiliser quelque chose comme:

ORDER BY "Employee_Name", CASE "Completed_Status" 
          WHEN 'Completed' THEN 0 
          WHEN 'Passed'  THEN 1 
          WHEN 'Incomplete' THEN 2 
          WHEN 'Failed'  THEN 3 
          ELSE     4 
          END; 

Vous devrez peut-être changer CASE pour travailler sur la valeur brute «p.status», auquel cas les conditions WHEN changent également:

ORDER BY "Employee_Name", CASE p.status 
          WHEN 'C' THEN 0 
          WHEN 'P' THEN 1 
          WHEN 'I' THEN 2 
          WHEN 'F' THEN 3 
          ELSE   4 
          END; 
+1

+1: 9i était la première version à prendre en charge CASE. Avant 9i, il faudrait que ce soit 'DECODE' ... –

3

Vous devez fournir l'ordre vous-même dans votre déclaration de cas:

SELECT ... 
ORDER BY Employee_Name, 
    (CASE WHEN Completion_Status = 'Completed' THEN 0 
      WHEN Completion_Status = 'Passed' THEN 1 
      WHEN Completion_Status = 'Incomplete' THEN 2 
      WHEN Completion_Status = 'Failed' THEN 3 
      ELSE 4 
    END) 
2

Pouvez-vous ajouter une nouvelle ligne à SELECT:

decode(p.status,'P',2, 'F',4, 'C',1, 'I',3, 5) "Completion_Status Level", 

puis ORDER BY il?

0

Merci à tous pour vos réponses:

Ce qui suit a fonctionné comme un charme!

ORDER BY "Employee_Name", CASE "Completed_Status" 
          WHEN 'Completed' THEN 0 
          WHEN 'Passed'  THEN 1 
          WHEN 'Incomplete' THEN 2 
          WHEN 'Failed'  THEN 3 
          ELSE     4 
          END; 
+1

Sympa que ça a marché. Peut-être pourriez-vous accepter l'une des réponses? –

Questions connexes