Est-il possible de sortir SUR une colonne en plus de celui spécifié dans SQL*Plus?
Ceci est difficile à expliquer, donc je vais essayer de montrer ce que je suis après à l'aide d'exemples. Veuillez noter que je ne suis pas de demander si il est possible d'utiliser plusieurs colonnes dans une BREAK
déclaration, je sais qu'il est.
Supposons que j'ai une requête du genre:
SELECT invoice_no, invoice_date, vendor, account, amount
FROM invoice
ORDER BY vendor, invoice_no, account
Et supposons que le résultat de ce qui est:
INVOICE_NO INVOICE_DATE VENDOR ACCOUNT AMOUNT
---------- ------------ ------- ------- ------
0001 30-JAN-2009 Alpha 1000 50.00
0003 30-JAN-2009 Alpha 1000 125.00
0003 30-JAN-2009 Alpha 3000 33.33
0006 02-FEB-2009 Alpha 2000 40.00
0005 31-JAN-2009 Bravo 1000 40.00
0002 30-JAN-2009 Charlie 2000 120.75
0002 30-JAN-2009 Charlie 3000 5.00
0004 30-JAN-2009 Charlie 1000 900.50
De sorte que vous pouvez voir que certains éditeurs ont plusieurs factures et des factures des comptes multiples.
Pour masquer le double de fournisseur de noms et de numéros de facture, je peux utiliser SQL*Plus de BREAK
de commande comme suit:
BREAK ON vendor ON invoice_no
Qui produit cet ensemble de résultats:
INVOICE_NO INVOICE_DATE VENDOR ACCOUNT AMOUNT
---------- ------------ ------- ------- ------
0001 30-JAN-2009 Alpha 1000 50.00
0003 30-JAN-2009 1000 125.00
30-JAN-2009 3000 33.33
0006 02-FEB-2009 2000 40.00
0005 31-JAN-2009 Bravo 1000 40.00
0002 30-JAN-2009 Charlie 2000 120.75
30-JAN-2009 3000 5.00
0004 30-JAN-2009 1000 900.50
Donc bon. Je tiens également à masquer duplicata de la facture de dates, de façon à ce que la première date de chaque facture est indiqué. Cependant, si j'utilise cette commande:
BREAK ON vendor ON invoice_no ON invoice_date
Il ira trop loin et masquer la date pour les factures 0003 0004 et, juste parce qu'ils sont les mêmes que les précédentes factures de leurs fournisseurs respectifs:
INVOICE_NO INVOICE_DATE VENDOR ACCOUNT AMOUNT
---------- ------------ ------- ------- ------
0001 30-JAN-2009 Alpha 1000 50.00
0003 1000 125.00
3000 33.33
0006 02-FEB-2009 2000 40.00
0005 31-JAN-2009 Bravo 1000 40.00
0002 30-JAN-2009 Charlie 2000 120.75
3000 5.00
0004 Charlie 1000 900.50
Ce que j'aimerais vraiment est une syntaxe de commande semblable à la suivante (j'ai fait le terme AND
):
BREAK ON vendor ON invoice_no AND invoice_date
L'intention est que, chaque fois qu'il se brise sur invoice_no, à casser aussi sur invoice_date (depuis que je sais que d'un seul numéro de la facture ne peut pas avoir deux dates de facturation):
INVOICE_NO INVOICE_DATE VENDOR ACCOUNT AMOUNT
---------- ------------ ------- ------- ------
0001 30-JAN-2009 Alpha 1000 50.00
0003 30-JAN-2009 1000 125.00
3000 33.33
0006 02-FEB-2009 2000 40.00
0005 31-JAN-2009 Bravo 1000 40.00
0002 30-JAN-2009 Charlie 2000 120.75
3000 5.00
0004 30-JAN-2009 Charlie 1000 900.50
Et maintenant les dates sont affichées correctement pour les factures 0003 0004 et.
Est-il possible de le faire dans SQL*Plus?
OriginalL'auteur yukondude | 2009-06-11
Vous devez vous connecter pour publier un commentaire.
Vous voulez quelque chose comme ceci:
où vous êtes réglage de la
column DUMMY
de ne pas impriméet puis le définir dans votre sélectionnez comme une concaténation des deux champs que vous avez besoin de vérifier.
MANNEQUIN est juste un nom arbitraire, mais l'utilisation la plus courante pour ce type de cas où vous avez besoin de calculer quelque chose, mais ne pas l'afficher
Le "
ON vendor ON invoice_no
" vous permettent de contrôler de dup sur les cols séparé du MANNEQUIN pause. De même, on peut calculer à l'aide deDUMMY
pour obtenir les totaux etc.OriginalL'auteur BrianH
Vous pouvez
BREAK ON
une expression, donc en tournant les champs d'intérêt dans les chaînes et la concaténation avec||
vous devriez être en mesure de mettre sur pied une expression qui permet de diviser "à la fois de leurs valeurs".Je crois (mais n'ont pas de SQL*Plus à portée de la main pour tester) que vous pouvez "BREAK (invoiceno||TO_CHAR(invoice_date))", -- c'est la PAUSE SUR pouvez utiliser une expression, pas seulement un nom de colonne.
J'ai essayé, mais ça ne fonctionne pas. Et de regarder, je ne suis pas sûr de savoir comment SQL*Plus serait de savoir pour arrêter l'impression, les doublons pour ces deux colonnes basées sur le contenu de cette expression. De ce que je peux glaner des docs, il semble que vous ne pouvez utiliser une expression si l'expression identique est utilisé dans l'instruction SELECT, mais un alias de colonne semble l'approche la plus simple dans ce cas.
Voici l'explication de SQLles Plus de l'Utilisateur Guide et Référence v10.2: "Vous pouvez utiliser une expression impliquant une ou plusieurs colonnes de la table ou un pseudonyme attribué à un rapport de colonne dans un SELECT SQL ou SQLen Plus de la COLONNE de commande. Si vous utilisez une expression dans une PAUSE de commande, vous devez entrer expr exactement comme il apparaît dans la commande SELECT. Si l'expression dans la commande SELECT est a+b, par exemple, vous ne pouvez pas utiliser b+a ou (a+b) dans une PAUSE de commande à renvoyer à l'expression dans la commande SELECT." (download.oracle.com/docs/cd/B19306_01/server.102/b14357/...)
OriginalL'auteur Alex Martelli
Il ne semble pas que SQL*Plus peut faire l'affaire. J'ai fini par utiliser
sed
pour se débarrasser de la date de facturation à chaque fois que le numéro de la facture était vide:OriginalL'auteur yukondude