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

Sådan bruger du ROLLUP, RANK() med pivottabel i Oracle11g

Jeg tror ikke, dine intervaller er helt rigtige for den forespørgsel, du har skrevet, selvom ordlyden af ​​opgaven er tvetydig, da 'mellem' er inklusiv - så som spørgsmålet er formuleret, vil en kreditscore på præcis 600 vises i begge 'nedre' og 'gennemsnitlige' parenteser. Din version vil sætte 600 i den 'nederste' parentes, men det kan diskuteres, hvilken den skal være i; Jeg ville tro, at det burde være 'gennemsnitligt' fra de andre definitioner, men det er uklart. Der er ingen parentes i spørgsmålet for scorer under 500, men hvis du har nogen af ​​dem, vil din nuværende kode inkludere dem i den 'gennemsnitlige' parentes, da de er mindre end 700, men ikke mellem 500 og 600.

Så jeg ville have tolket det som:

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

Din spørgsmåls titel henviser til ROLLUP, og for at få den samlede række kan du bruge denne funktion:

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

Hvis du har nogen score under 500, vil Begge inkludere en linje for dem med creditscore_range som null; hvilket er forvirrende med ROLLUP version. Du ønsker måske at filtrere alle scores mindre end 500 ud fra den inderste forespørgsel, men igen er det ikke klart, om det er nødvendigt eller ønskeligt.

Jeg er dog ikke sikker på, at opgaven leder efter, når den taler om rangering. Det indebærer at ændre kolonnerækkefølgen baseret på de værdier, de indeholder. Rangering efter stat ville give mere mening, hvis dataene blev drejet den anden vej.




  1. Find, om en kolonne har en unik begrænsning

  2. opfylder den nødvendige mængde ved hjælp af mysql

  3. Django model til en Postgres udsigt

  4. Hvordan kan jeg rydde hukommelsen, mens jeg kører et langt PHP-script? prøvet unset()