Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment utiliser ROLLUP, RANK() avec un tableau croisé dynamique dans Oracle11g

Je ne pense pas que vos plages soient tout à fait adaptées à la requête que vous avez écrite, bien que le libellé de l'affectation soit ambigu car "entre" est inclus - de sorte que la question est formulée, un score de crédit d'exactement 600 apparaîtrait dans les deux les tranches « inférieure » et « moyenne ». Votre version mettra 600 dans la tranche "inférieure", mais il est discutable de savoir dans quelle position elle devrait figurer ; Je pense que cela devrait être «moyen» par rapport aux autres définitions, mais ce n'est pas clair. Il n'y a pas de tranche dans la question pour les scores inférieurs à 500, mais si vous en avez, votre code actuel les inclura dans la tranche "moyenne", puisqu'ils sont inférieurs à 700 mais pas entre 500 et 600.

J'aurais donc interprété cela comme :

SELECT * FROM (
  SELECT case
           when CREDITSCORE >= 500 and CREDITSCORE < 600 then 'LOWER RANGE(500-600)'
           when CREDITSCORE >= 600 and CREDITSCORE < 700 then 'AVERAGE RANGE(600-700)'
           when CREDITSCORE >= 700 then 'PREMIUM RANGE(700+)'
    end as CREDITSCORE_RANGE,
    state
  FROM customer
) 
PIVOT (
  count(state) FOR state IN ('PA' as pa, 'CA' as ca, 'NY' as ny, 'MD' as md)
);

Le titre de votre question fait référence à ROLLUP, et pour obtenir le total de la ligne, vous pouvez utiliser cette fonction :

SELECT creditscore_range, sum(pa) AS pa, sum(ca) AS ca, sum(ny) AS ny, sum(md) AS md
FROM (
  SELECT * FROM (
    SELECT CASE
             WHEN creditscore >= 500 AND creditscore < 600 THEN 'LOWER RANGE(500-600)'
             WHEN creditscore >= 600 AND creditscore < 700 THEN 'AVERAGE RANGE(600-700)'
             WHEN creditscore >= 700 THEN 'PREMIUM RANGE(700+)'
      END AS creditscore_range,
      state
    FROM customer
  ) 
  PIVOT (
    COUNT(state) FOR state IN ('PA' AS pa, 'CA' AS ca, 'NY' AS ny, 'MD' AS md)
  )
)
GROUP BY ROLLUP (creditscore_range);

Si vous avez des scores inférieurs à 500, les deux incluront une ligne pour ceux avec le creditscore_range comme nul ; qui prête à confusion avec le ROLLUP version. Vous voudrez peut-être filtrer les scores inférieurs à 500 à partir de la requête la plus interne, mais encore une fois, il n'est pas clair si cela est nécessaire ou souhaitable.

Je ne suis pas sûr que la mission recherche quand elle parle de classement. Cela implique de changer l'ordre des colonnes en fonction des valeurs qu'elles contiennent. Le classement par état aurait plus de sens si les données étaient pivotées dans l'autre sens.