Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como usar ROLLUP, RANK() com tabela dinâmica no Oracle11g


Não acho que seus intervalos estejam corretos para a consulta que você escreveu, embora o texto da tarefa seja ambíguo, pois 'entre' é inclusivo - então, à medida que a pergunta é formulada, uma pontuação de crédito de exatamente 600 apareceria em ambos os colchetes 'inferior' e 'médio'. Sua versão colocará 600 no colchete 'inferior', mas é discutível em qual deveria estar; Eu acho que deveria ser 'média' das outras definições, mas não está claro. Não há colchetes na pergunta para pontuações inferiores a 500, mas se você tiver algum desses, seu código atual os incluirá no colchete 'médio', pois são inferiores a 700, mas não entre 500 e 600.

Então eu teria interpretado isso como:
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)
);

O título da sua pergunta se refere a ROLLUP e, para obter a linha total, você pode usar essa função:
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);

Se você tiver alguma pontuação abaixo de 500, Ambos incluirão uma linha para aqueles com o creditscore_range como nulo; que é confuso com o ROLLUP versão. Você pode querer filtrar qualquer pontuação inferior a 500 da consulta mais interna, mas novamente não está claro se isso é necessário ou desejável.

Não tenho certeza de que a atribuição esteja procurando quando fala sobre classificação. Isso implica alterar a ordem das colunas com base nos valores que elas contêm. A classificação por estado faria mais sentido se os dados fossem girados para o outro lado.