sql >> Base de Datos >  >> RDS >> Oracle

Cómo usar ROLLUP, RANK() con tabla dinámica en Oracle11g

No creo que sus rangos sean del todo correctos para la consulta que ha escrito, aunque la redacción de la tarea es ambigua ya que 'entre' es inclusivo; por lo tanto, tal como está redactada la pregunta, aparecería una puntuación de crédito de exactamente 600 en ambos los soportes 'inferior' y 'promedio'. Su versión pondrá 600 en el soporte 'inferior', pero es discutible en cuál debería estar; Creo que debería ser 'promedio' de las otras definiciones, pero no está claro. No hay paréntesis en la pregunta para puntajes inferiores a 500, pero si tiene alguno de ellos, su código actual los incluirá en el paréntesis 'promedio', ya que son menos de 700 pero no entre 500 y 600.

Así que lo habría interpretado 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)
);

El título de su pregunta se refiere a ROLLUP, y para obtener la fila total puede usar esa función:

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 tiene puntajes por debajo de 500, Ambos incluirán una línea para aquellos con el creditscore_range como nulo; lo cual es confuso con el ROLLUP versión. Es posible que desee filtrar las puntuaciones inferiores a 500 de la consulta más interna, pero, de nuevo, no está claro si eso es necesario o deseable.

Sin embargo, no estoy seguro de que la tarea esté buscando cuando habla de clasificación. Eso implica cambiar el orden de las columnas en función de los valores que contienen. La clasificación por estado tendría más sentido si los datos se giraran al revés.