3 votes

Comment renvoyer un texte spécifique lorsque plusieurs enregistrements sont présents

Je suis relativement novice en matière de SQL et je vais essayer d'utiliser la bonne terminologie. J'ai deux tables, tbl_Trans qui contient les détails généraux de la transaction, et tbl_TransData qui contient les détails de la transaction.

Je veux montrer chaque enregistrement de trans et la catégorie de la trans qui est contenue dans la tbl_TransData. S'il y a plus d'une catégorie pour chaque Trans, je veux que le texte soit 'Mulitple', sinon je veux renvoyer le champ de la catégorie.

Contenu de la table TRANS

int_Trans_ID    dtm_TransDate   txt_Type    txt_Description txt_Bank dbl_Amount
1               17/12/2018      REC         Sales           Current 1000
2               20/12/2018      PAY         Expenses paid   Current -155
3               21/12/2018      PAY         MW Repairs      Current -250

Contenu de la table TRANSDATA

int_TransData_ID    int_TransID txt_Category    dbl_Amount
1                   1           Sales A         -600
2                   1           Sales B         -400
3                   2           Travel          100
4                   2           Meal            55
5                   3           MW Repairs      250

Voici le code jusqu'à présent, mais si je remplace le ELSE 'Single' par ELSE txt_Category, cela ne fonctionne pas.

SELECT
int_Trans_ID,
dtm_TransDate AS Date,
txt_Type AS Type,
txt_Description AS Description,
    (SELECT 
            CASE
                WHEN count(int_TransID) > 1
                THEN 'Multiple'
                ELSE 'Single'
            END
    FROM
        dbo.tbl_TransData TD
    WHERE
        TD.int_TransID = T.int_Trans_ID) AS Category
FROM
   tbl_Trans T
GROUP BY
   int_Trans_ID, dtm_TransDate, txt_Type, txt_Description

C'est ce que j'aimerais voir.

int_Trans_ID    Date        Type    Description   Category
1               2018-12-17  REC     Sales         Multiple
2               2018-12-20  PAY     Expenses paid Multiple
3               2018-12-21  PAY     Car Repairs   MW Repairs

Désolé pour le format des tableaux.

Toute aide serait très appréciée, ou même m'indiquer la direction d'autres postes.

2voto

The Impaler Points 8721

Je le ferais :

with
x as (
  select ins_trans_id, count(*) as cnt, max(txt_category) as cat 
  from transdata
  group by ins_trans_id
)
select
  t.int_trans_id,
  t.dtm_transdate,
  t.txt_type,
  t.txt_description,
  case when x.cnt = 0 then 'no category'
       when x.cnt = 1 then x.cat
       else 'Multiple' end as Category
from trans t
left join x on x.int_trans_id = t.int_trans_id

1voto

Jetez un coup d'œil à ceci, J'ai écrit une sous-requête pour la condition de cas

SELECT
  int_Trans_ID,
  dtm_TransDate,
  txt_type,
  txt_Description,
  CASE WHEN (SELECT COUNT(*) FROM tbl_Trans_Data td WHERE td.int_Trans_ID = t.int_Trans_ID)) > 1 THEN
    'MULTIPLE'
  ELSE 
    (SELECT Category from tbl_trans_data td Where td.int_Trans_ID = t.int_Trans_ID)
  END AS Category
FROM
  tbl_Trans t

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X