0
votes

Comment résumer des colonnes dans la même ligne?

J'ai une table comme ci-dessous: xxx

Comment fonctionne le tableau est que pympt_no1 correspond à pymt_amt1, etc ...

Ce que j'essaie de faire est , Total des colonnes PYMT_AMT sur la base d'une déclaration de cas où le pympty_no est entre une plage de valeurs.

Par exemple, j'essaie d'obtenir le total pympt_amt où l'une des pymt_no est comprise entre 100 et 150. Donc, dans ce cas pour la table ci-dessus, seule pympt_no1 et pymt_no3 ont une valeur comprise entre 100 et 150 , donc j'ai besoin de totaliser le pymt_amt qui correspond à cela, de sorte que le total ici serait 140.

J'ai essayé la requête ci-dessous, mais mon problème est qu'il ne fait que tirer le premier pymt_amt uniquement et non Le reste pour moi d'ajouter ensemble: xxx

Ma pensée derrière ce processus pour l'échantillon ci-dessus était de par exemple dans le CTE, car il ressemble à quelque chose comme ceci: xxx

puis avec ceci stocké dans le CTE, je pourrais résumer la colonne de quantité et le groupe par la colonne ID pour obtenir le total correct.

Toute aide avec C'est grandement apprécié.


0 commentaires

3 Réponses :


1
votes

Un moyen d'entretenir cette demande consiste à utiliser une série de requêtes syndicales pour chaque paire de colonnes. Si vos données correspondent à votre taille de colonne d'échantillon, il s'agit d'un moyen assez rapide d'atteindre le résultat. Vous pouvez ensuite envelopper votre requête avec une requête externe qui résume vos valeurs xxx pré>

si vous voulez vraiment le faire sous forme de CTE, vous pouvez le faire comme ça: P>

declare @pymt table  (id  int,    pymt_no1  int,   pymt_no2   int,   pymt_no3   int, pymt_no4 int,    pymt_amt1  int,   pymt_amt2    int,   pymt_amt3  int,  pymt_amt4 int);

insert @pymt (
id ,     pymt_no1  ,   pymt_no2   ,   pymt_no3   , pymt_no4   ,  pymt_amt1  ,   pymt_amt2    ,   pymt_amt3   , pymt_amt4)
values

(25  ,    100  ,        5       ,      150   ,        50   ,          60     ,      70   ,         80        ,      90);

with pymt as (
select pymt_no1, pymt_amt1 as amount_to_sum from @pymt where pymt_no1 between 100 and 150
union
select pymt_no2, pymt_amt2 from @pymt where pymt_no2 between 100 and 150
union
select pymt_no3, pymt_amt3 from @pymt where pymt_no3 between 100 and 150
union
select pymt_no4, pymt_amt4 from @pymt where pymt_no4 between 100 and 150)

select sum(amount_to_sum) from pymt;


0 commentaires

2
votes

Vous devez ajouter de l'affaire pour chaque colonne

--Sample table and Data 
CREATE TABLE #temp (
    id INT ,
    pymt_no1 int,
    pymt_no2 INT,
    pymt_no3 INT,
    pymt_no4 INT,
    pymt_amt1 INT,
    pymt_amt2 INT,
     pymt_amt3 INT,
     pymt_amt4 INT)

 INSERT #temp (   id ,
                  pymt_no1 ,
                  pymt_no2 ,
                  pymt_no3 ,
                  pymt_no4 ,
                  pymt_amt1 ,
                  pymt_amt2 ,
                  pymt_amt3 ,
                  pymt_amt4
              )
 VALUES (   25 , -- id - int
       100 , -- pymt_no1 - int
       5 , -- pymt_no2 - int
       150 , -- pymt_no3 - int
       50 , -- pymt_no4 - int
       60 , -- pymt_amt1 - int
       70 , -- pymt_amt2 - int
       80 , -- pymt_amt3 - int
       90   -- pymt_amt4 - int
   )



--Solution
with pymt as (
SELECT 
id,
 CASE  WHEN pymt_no1 BETWEEN 100 and 150 THEN pymt_amt1 ELSE 0 END AS AmOUNT1 ,
 CASE  WHEN pymt_no2 BETWEEN 100 and 150 THEN pymt_amt2  ELSE 0 END AS AmOUNT2 ,
 CASE  WHEN pymt_no3 BETWEEN 100 and 150 THEN pymt_amt3  ELSE 0 END AS Amount3 ,
 CASE  WHEN pymt_no4 BETWEEN 100 and 150 THEN pymt_amt4  ELSE 0 END AS Amount4 

 FROM #temp
 )


SELECT 
  id,
  SUM([Amount1] + pymt.AmOUNT2 + pymt.Amount3 + pymt.Amount4) as [Total]
 FROM pymt
 GROUP BY id


0 commentaires

1
votes

Autre moyen:

select id,
    sum(
    (case when pymt_no1 between 100 and 150 then pymt_no1 else 0 end) +
    (case when pymt_no2 between 100 and 150 then pymt_no2 else 0 end) +
    (case when pymt_no3 between 100 and 150 then pymt_no3 else 0 end) +
    (case when pymt_no4 between 100 and 150 then pymt_no4 else 0 end)
    )
from pymt
group by id


0 commentaires