J'ai une table comme ci-dessous: Comment fonctionne le tableau est que pympt_no1 correspond à pymt_amt1, etc ... p> 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. P> 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. p> 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: p> 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: p> 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. P> Toute aide avec C'est grandement apprécié. P> p>
3 Réponses :
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 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;
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
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