J'ai une sortie comme celle-ci:

Volume               c1                     c2
--------------------------------------------------
0                   1000                     0
1-20                 100                    10
20+                   50                    40 

J'obtiens cette sortie par ceci:

SELECT 
case when volume=0 then '0' when volume <21 then '1-20' when volume>=21 then '21+' as Volume,
sum(ab) as c1,
sum(xy) as c2
FROM 
table t
GROUP BY
case when volume=0 then '0' when volume <21 then '1-20' when volume>=21 then '21+'

Cependant, je dois obtenir la sortie comme ci-dessous. J'essaie de soustraire la somme de la colonne c1 de la somme de la colonne c2 et le résultat doit être placé à la première ligne sous la colonne c2 comme ceci:

Volume                c1                  c2
--------------------------------------------------
0                   1000                **1100**
1-20                 100                  10
20+                   50                  40 

Comment puis-je faire ceci?

Merci d'avance.

0
user13619579 2 juin 2020 à 21:04

3 réponses

Meilleure réponse

Je ferais simplement:

SELECT (case when volume = 0 then '0' when volume < 21 then '1-20' when volume>=21 then '21+' end) as Volume,
       sum(ab) as c1,
       (case when volume = 0
             then sum(sum(ab)) over () - sum(sum(xy))
             else sum(xy)
       end) as c2
FROM  table t
GROUP BY (case when volume=0 then '0' when volume <21 then '1-20' when volume>=21 then '21+' end);

Les sous-requêtes et les CTE ne sont pas nécessaires lorsque vous pouvez simplement utiliser les fonctions de fenêtre.

1
Gordon Linoff 2 juin 2020 à 19:20

Vous pouvez utiliser la requête ci-dessous pour obtenir la sortie dont vous avez besoin avec l'expression de table CTE que vous pouvez obtenir.

Avec Cte comme (SELECT cas quand volume = 0 puis '0' quand volume <21 puis '1-20' quand volume> = 21 puis '21 + 'comme volume, somme (ab) comme c1, somme (xy) comme c2 , sum (ab) -sum (xy) as c FROM table t GROUP BY case quand volume = 0 puis '0' quand volume <21 puis '1-20' quand volume> = 21 puis '21 + 'end)

Sélectionnez volume, c1, cas lorsque Volume = '0' puis (sélectionnez somme (c3) de cte) sinon c2 fin c2 de cte

0
Praful Bangal 2 juin 2020 à 18:36
WITH x
AS
(
  SELECT 
    case when volume=0 then '0' when volume <21 then '1-20' when volume>=21 then '21+' as Volume,
    sum(ab) as c1,
    sum(xy) as c2
  FROM 
    table t
  GROUP BY
    CASE when volume=0 then '0' when volume <21 then '1-20' when volume>=21 then '21+'
)
SELECT x.Volume, x.c1, (CASE WHEN x.Volume = 0 
                             THEN (SELECT SUM(x2.c1 - x2.c2) 
                                   FROM x AS x2) 
                             ELSE x.c2 END)
FROM x
1
MPost 2 juin 2020 à 18:20