J'ai un tableau (exemple simplifié ci-dessous) composé de TEST (s), TESTPRICE par test et TESTSTATUS. Je souhaite pouvoir exécuter une requête qui aboutira à deux colonnes agrégées, une pour les revenus en attente et une pour les revenus démarrés par groupe de test.

tblREQUEST

Je peux facilement générer deux tableaux de résultats distincts en exécutant ce qui suit:

SELECT
    Test
    ,SUM(TESTPRICE) AS 'PendingRev'
FROM
    REQUEST
WHERE
    TESTSTATUS = 'P'
GROUP BY
    TEST
ORDER BY
    TEST
SELECT
    Test
    ,SUM(TESTPRICE) AS 'StartedRev'
FROM
    REQUEST
WHERE
    TESTSTATUS = 'S'
GROUP BY
    TEST
ORDER BY
    TEST

Il en résulte deux résultats comme celui-ci:

enter image description here

enter image description here

Cependant, je préférerais un tableau de résultats de sortie unique comme celui-ci:

Desired Output

Quelqu'un peut-il m'indiquer la bonne direction ici, me conseiller sur une technique sur laquelle je peux lire - j'ai essayé plusieurs approches différentes (sous-requêtes, etc.) mais la plus proche que je semble obtenir est une somme totale pour un TESTSTATUS donné en toutes les lignes ou erreurs

Toute aide est appréciée

1
Jarrod Dall 29 août 2020 à 21:27

2 réponses

Meilleure réponse

Utilisation de l'agrégation conditionnelle, qui dans la plupart des bases de données ressemble à ceci:

SELECT Test, 
       SUM(CASE WHEN TESTSTATUS = 'P' THEN TESTPRICE END) AS PendingRev,
       SUM(CASE WHEN TESTSTATUS = 'S' THEN TESTPRICE END) AS StartedRev
FROM REQUEST
GROUP BY TEST
ORDER BY TEST;
1
Gordon Linoff 29 août 2020 à 18:30

Vous pouvez utiliser Pivot pour obtenir le même résultat:

Démo

SELECT * FROM TABLE1
PIVOT (SUM(TESTPRICE)
 FOR TESTSTATUS IN ('P' as PendingRev  , 'S' as StartedRev ));
0
Atif 29 août 2020 à 19:06