2013-05-28 4 views
2

J'ai deux tables. Titre et ordre. Le titre a title_num. L'ordre a title_num et order_num. Chaque titre a beaucoup d'ordres.Afficher plusieurs lignes avec une colonne

Je voudrais afficher title_num et toutes ses commandes. Mais je voudrais l'afficher pour que j'afficher 1 title_num pour plusieurs order_nums:

title_num| order_num 
1   a 
1   b 
1   c 
2   x 
2   y 

Je voudrais qu'il ressemble à:

title_num| order_num 

1   a 
      b 
      c 

2   x 
      y 

J'ai essayé d'utiliser à gauche rejoindre pour trier par le titre mais c'est là que je suis coincé. Est-il possible de l'afficher comme ça?

select t.title_num, o.order_num 
from title t 
left join order o 
on t.title_num=o.title_num 
+0

Si vous utilisez SQL * Plus pour cela, alors vous pouvez utiliser la fonctionnalité (http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve009.htm) [ 'break'] [décrit dans la documentation] (http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_six.htm # i1081534) pour y parvenir, y compris l'écart entre les valeurs (par exemple 'break on title_num nodup skip 1'). Cela ne semble pas avoir été reporté sur SQL Developer malheureusement. –

Répondre

3

(Ne pas avoir assez de représentant pour commenter, donc je vais donner les options dans une réponse)

Vous ne pouvez pas cacher un résultat si son identique à la ligne précédente. Au lieu de cela, vous le manipulez dans le code ou le rapport.

  • Si vous l'affichez dans un rapport, vous regrouperez les résultats dans le gestionnaire de rapports.

  • Si vous itérez du code, ayez une variable qui conserve la trace de cette variable de colonne.

    Initialise la variable avec une chaîne vide. Puis, lorsque vous parcourez l'ensemble de données de la requête:

    1. Si la valeur de ligne actuelle est la même que la valeur de la variable, affichez un blanc. Sinon, affichez la valeur de ligne.
    2. Définissez la variable sur la valeur de la ligne en cours.
+1

Oui, l'afficher dans le rapport lui-même était beaucoup plus facile que d'essayer de faire fonctionner ma requête SQL. Merci. – user2300868

+1

Excellent, heureux je pourrais aider! (Cough Cough .. marque la mienne comme réponse;)) – Stamp

2

Vous pouvez le faire avec la fonction LAG et une instruction CASE.

SELECT CASE WHEN LAG(title_num,1) OVER (PARTITION BY title_num ORDER BY order_num) IS NULL THEN title_num 
       ELSE ' ' 
     END 
     ,order_num 
FROM Order 

SQL Fiddle Demo

+0

J'ai essayé ceci en premier mais j'avais aussi d'autres paramètres à afficher aussi alors j'abandonne dessus. Heureusement, je l'ai eu à travailler dans mon rapport en quelque sorte. Merci pour votre aide si, j'ai appris un peu plus sur mes questions après avoir essayé de travailler sur ce code, donc c'était toujours utile. – user2300868

1

utiliser la fonction de fenêtre (fonction analytique dans le langage Oracle) row_number():

SELECT CASE WHEN row_number() OVER (PARTITION BY title_num 
            ORDER BY order_num) = 1 THEN 
     title_num ELSE NULL END AS title_num 
     ,order_num 
FROM ord o 
ORDER BY o.title_num, order_num; 

->SQLfiddle. Pourquoi avez-vous JOIN à title du tout? Y a-t-il des titres sans commande? Sinon, vous pouvez simplement l'omettre de la requête. Ne pas utiliser les mots réservés comme order comme noms de table. J'utilise ord à la place dans ma solution.

Notez comment je qualifie la table o.title_num dans ORDER BY pour faire référence à la colonne d'entrée, pas à la colonne de sortie.

+0

J'utilisais join parce que j'avais plus de paramètres des deux tables qui devaient être affichés. Mais je pense avoir obtenu les résultats que je voulais. Après avoir vu votre code, je me rends compte que j'étais trop penser au problème. Merci. – user2300868

Questions connexes