Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Verwendung von ROLLUP, RANK() mit Pivot-Tabelle in Oracle11g

Ich glaube nicht, dass Ihre Bereiche für die von Ihnen geschriebene Abfrage ganz richtig sind, obwohl der Wortlaut der Aufgabe mehrdeutig ist, da "zwischen" eingeschlossen ist - so wie die Frage formuliert ist, würde in beiden ein Kredit-Score von genau 600 erscheinen die „untere“ und die „durchschnittliche“ Klammer. Ihre Version wird 600 in die „untere“ Klammer einordnen, aber es ist fraglich, in welcher es sich befinden sollte. Ich würde denken, dass es von den anderen Definitionen "durchschnittlich" sein sollte, aber es ist unklar. Es gibt keine Klammer in der Frage für Punktzahlen unter 500, aber wenn Sie eine davon haben, wird Ihr aktueller Code sie in die „Durchschnitts“-Klammer aufnehmen, da sie weniger als 700, aber nicht zwischen 500 und 600 liegen.

Also hätte ich das interpretiert als:

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

Ihr Fragentitel bezieht sich auf ROLLUP, und um die Gesamtzeile zu erhalten, können Sie diese Funktion verwenden:

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

Wenn Sie Punkte unter 500 haben, enthält Both eine Zeile für diejenigen mit dem creditscore_range als null; was mit dem ROLLUP verwirrend ist Ausführung. Möglicherweise möchten Sie alle Punktzahlen unter 500 aus der innersten Abfrage herausfiltern, aber auch hier ist nicht klar, ob dies erforderlich oder wünschenswert ist.

Ich bin mir nicht sicher, ob die Aufgabe sucht, wenn es um das Ranking geht. Das impliziert, dass die Spaltenreihenfolge basierend auf den darin enthaltenen Werten geändert wird. Eine Rangfolge nach Staat wäre sinnvoller, wenn die Daten in die andere Richtung geschwenkt würden.