Oracle
 sql >> Database >  >> RDS >> Oracle

Come utilizzare ROLLUP, RANK() con tabella pivot in Oracle11g

Non penso che i tuoi intervalli siano giusti per la query che hai scritto, anche se la formulazione del compito è ambigua poiché "tra" è inclusivo, quindi poiché la domanda è formulata, in entrambi apparirà un punteggio di credito di esattamente 600 le parentesi 'minore' e 'medio'. La tua versione metterà 600 nella parentesi "inferiore", ma è discutibile quale dovrebbe essere; Penserei che dovrebbe essere "nella media" dalle altre definizioni, ma non è chiaro. Non ci sono parentesi nella domanda per i punteggi inferiori a 500, ma se ne hai qualcuno, il tuo codice attuale li includerà nella parentesi "media", poiché sono inferiori a 700 ma non compresi tra 500 e 600.

Quindi l'avrei interpretato come:

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)
);

Il titolo della tua domanda si riferisce a ROLLUP e per ottenere la riga totale puoi utilizzare quella funzione:

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 hai punteggi inferiori a 500, entrambi includeranno una riga per quelli con creditscore_range come nullo; che confonde con il ROLLUP versione. Potresti voler filtrare tutti i punteggi inferiori a 500 dalla query più interna, ma ancora una volta non è chiaro se ciò sia necessario o desiderabile.

Non sono sicuro che l'incarico stia cercando quando si parla di classifica però. Ciò implica la modifica dell'ordine delle colonne in base ai valori che contengono. La classificazione per stato avrebbe più senso se i dati venissero ruotati nell'altro modo.