Différence de deux colonnes SQL

Fermé
EBIM20 - 16 sept. 2019 à 10:28
yg_be Messages postés 22711 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 avril 2024 - 26 sept. 2019 à 10:59
Bonjour, la requête suivante permet d'extraire un code, une description et la valeur de l'élément en question, j'ai en fait besoin d'afficher la différence de deux champs dans la 3ème colonne sans devoir afficher les codes des éléments de l'opération, par ex:

SELECT
  Employee.RegistrationNumber AS Matricule,
  PaycheckLine.OLCodeItem AS [Code de l'élément exonéré],
  PaycheckLine.Label AS Description
  (CASE WHEN PaycheckLine.OLCodeItem='GI_DEP_PP#' THEN  PaycheckLine.EmployeeAmount ELSE 0 END) AS [Montant non imposable]
 (CASE WHEN PaycheckLine.OLCodeItem='GI_DEP_PP_IMP#' THEN  PaycheckLine.EmployeeAmount ELSE 0 END) AS [Montant Imposable]

FROM ((PaycheckLine

LEFT OUTER JOIN Item
  ON ((PaycheckLine.UCodeItem = Item.UCode))
LEFT OUTER JOIN Paycheck
  ON ((PaycheckLine.PaycheckId = Paycheck.Id)))
LEFT OUTER JOIN Employee
  ON ((Paycheck.UCodeEmployee = Employee.UCode)))


WHERE (((Employee.VersionStatus = 1)
OR (Employee.VersionStatus IS NULL)))



Dans cet exemple, ma prochaine colonne doit m'afficher le montant de GI_DEP_PP#-GI_DEP_PP_IMP# as 'NOM', pourriez vous m'aider SVP ?
A voir également:

2 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
16 sept. 2019 à 11:34
Bonjour,

Pour ça, il faudrait pouvoir avoir les deux données sur la même ligne, alors qu'elle sont pour l'instant sur deux lignes différentes.
Il y a plusieurs façons de réaliser ça, mais ça va dépendre d'une question préalable : les champs OLCodeItem et Label doivent venir de laquelle des deux lignes ?

Xavier
0
EBIM20 Messages postés 42 Date d'inscription vendredi 19 avril 2019 Statut Membre Dernière intervention 25 avril 2021
17 sept. 2019 à 18:34
Rebonjour,
en fait j'ai besoin d'afficher le code de l'élément, la decription et une 3èeme colonne qui me calcule la différence de deux éléments dont je précise les codes.
Je ne sais pas si j'ai répondu à votre question?
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
18 sept. 2019 à 08:59
Non :)
Aujourd'hui dans ta base, les deux valeurs que tu veux combiner sont stockées sur deux lignes différentes.
Chacune de ces deux lignes contient un code PaycheckLine.OLCodeItem et une description PaycheckLine.Label.
Ma question, peut-être pas très bien posée, c'est celle-là : est-ce que ces codes sont nécessairement identiques ? Si non, lequel doit-on renvoyer ?

Xavier

(PS dans ta requête d'origine, tu écris
SELECT [...] PaycheckLine.OLCodeItem AS [Code de l'élément exonéré]
. Est-ce que cça ne devrait pas plutôt être PaycheckLine.UCodeItem ?)
0
D'accord.en fait les codes et les descriptions je les ai.cest le calcul de la 3eme colonne qui cause probleme.je vous explique dans ma base jai des elements de cette maniere (code , description et valeur de lelement) pour le cas de sfrais de deplacement jai deux elements qui sont "GI_DEP_PP" ET "GI_DEP_PP_IMP" c'est a dire que pour chaque indemnité jai une partie globale et une partie imposable Et donc je minteresse a calculer la partie exoneree qui est la difference entre les deux et l'afficher dans une colonne.je n'étais pas brève mais je ne trouve pas comment mieux vs expliquer
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
18 sept. 2019 à 11:54
J'ai bien compris tout ça :)
C'est juste que les deux lignes vont être fusionnées en une seule dans le résultat ; or tu demandes d'autres champs de ces deux lignes ! Donc ma question, c'est comment on choisit lequel des deux on affiche...

Pour te faire comprendre ce que je veux dire, je te propose cette requête-là qui résout ton problème mais pourra donner des infos en trop :
WITH pp  AS (SELECT UCodeItem, PaycheckId, EmployeeAmount, Label FROM PaycheckLine WHERE OLCodeItem='GI_DEP_PP#'),
     imp AS (SELECT UCodeItem, PaycheckId, EmployeeAmount, Label FROM PaycheckLine WHERE OLCodeItem='GI_DEP_PP_IMP#')
SELECT
    Employee.RegistrationNumber AS Matricule,
    pp.UCodeItem AS UCodeItem_PP,
    pp.Label AS Label_PP,
    pp.EmployeeAmount AS [Montant non imposable],
    imp.UCodeItem AS UCodeItem_IMP,
    imp.Label AS Label_IMP,
    imp.EmployeeAmount AS [Montant Imposable],
    pp.EmployeeAmount - imp.EmployeeAmount AS [Différence montants]
FROM Paycheck
INNER JOIN pp ON Paycheck.Id = pp.PaycheckId
INNER JOIN imp ON Paycheck.Id = imp.PaycheckId
LEFT OUTER JOIN Employee ON Paycheck.UCodeEmployee = Employee.UCode
WHERE Employee.VersionStatus = 1 OR Employee.VersionStatus IS NULL

Tu vois que tu as deux fois les Codes et Label, et ma question était simplement de savoir lequel choisir...

Xavier
0
J'ai testé mais j'ai pas les bonnes valeurs je vais rectifier dans la requete et je partagerai le résultat
0
yg_be Messages postés 22711 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 avril 2024 1 474
Modifié le 18 sept. 2019 à 11:46
bonjour, les montants imposables et non imposables sont-ils sur la même ligne, dans la réponse à la requête?
si non, je suggère ceci:
SELECT
  Employee.RegistrationNumber AS Matricule,
  PaycheckLine.OLCodeItem AS [Code de l'élément exonéré],
  PaycheckLine.Label AS Description,
  sum((CASE WHEN PaycheckLine.OLCodeItem='GI_DEP_PP#' THEN  PaycheckLine.EmployeeAmount ELSE 0 END)) AS [Montant non imposable],
 sum((CASE WHEN PaycheckLine.OLCodeItem='GI_DEP_PP_IMP#' THEN  PaycheckLine.EmployeeAmount ELSE 0 END)) AS [Montant Imposable],
sum((CASE WHEN PaycheckLine.OLCodeItem='GI_DEP_PP#' THEN  PaycheckLine.EmployeeAmount ELSE 0 END))
- sum((CASE WHEN PaycheckLine.OLCodeItem='GI_DEP_PP_IMP#' THEN  PaycheckLine.EmployeeAmount ELSE 0 END)) as [partie exoneree]

FROM ((PaycheckLine

LEFT OUTER JOIN Item
  ON ((PaycheckLine.UCodeItem = Item.UCode))
LEFT OUTER JOIN Paycheck
  ON ((PaycheckLine.PaycheckId = Paycheck.Id)))
LEFT OUTER JOIN Employee
  ON ((Paycheck.UCodeEmployee = Employee.UCode)))


WHERE (((Employee.VersionStatus = 1)
OR (Employee.VersionStatus IS NULL)))

group by
Employee.RegistrationNumber,
PaycheckLine.OLCodeItem,
PaycheckLine.Label
0
Ça me retourne que des 0 mais je vais travailler sur la requête et je partagerai aussi les résultats
0
yg_be Messages postés 22711 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 avril 2024 1 474 > EBIM20
Modifié le 23 sept. 2019 à 16:06
et ainsi?
SELECT
  Employee.RegistrationNumber AS Matricule,
  sum((CASE WHEN PaycheckLine.OLCodeItem='GI_DEP_PP#' THEN  PaycheckLine.EmployeeAmount ELSE 0 END)) AS [Montant non imposable],
 sum((CASE WHEN PaycheckLine.OLCodeItem='GI_DEP_PP_IMP#' THEN  PaycheckLine.EmployeeAmount ELSE 0 END)) AS [Montant Imposable],
sum((CASE WHEN PaycheckLine.OLCodeItem='GI_DEP_PP#' THEN  PaycheckLine.EmployeeAmount ELSE 0 END))
- sum((CASE WHEN PaycheckLine.OLCodeItem='GI_DEP_PP_IMP#' THEN  PaycheckLine.EmployeeAmount ELSE 0 END)) as [partie exoneree]
FROM ((PaycheckLine
LEFT OUTER JOIN Item
  ON ((PaycheckLine.UCodeItem = Item.UCode))
LEFT OUTER JOIN Paycheck
  ON ((PaycheckLine.PaycheckId = Paycheck.Id)))
LEFT OUTER JOIN Employee
  ON ((Paycheck.UCodeEmployee = Employee.UCode)))
WHERE (((Employee.VersionStatus = 1)
OR (Employee.VersionStatus IS NULL)))
group by
Employee.RegistrationNumber
0
EBIM20 Messages postés 42 Date d'inscription vendredi 19 avril 2019 Statut Membre Dernière intervention 25 avril 2021
25 sept. 2019 à 10:17
Bonjour, no ça retourne pas la bonne valeur c'est à dire la différence de la partie global moins la aprtie imposable
0
yg_be Messages postés 22711 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 avril 2024 1 474 > EBIM20 Messages postés 42 Date d'inscription vendredi 19 avril 2019 Statut Membre Dernière intervention 25 avril 2021
25 sept. 2019 à 11:02
cela retourne quoi?
0
EBIM20 Messages postés 42 Date d'inscription vendredi 19 avril 2019 Statut Membre Dernière intervention 25 avril 2021
Modifié le 25 sept. 2019 à 12:49
retourne ça
0