sql >> Databasteknik >  >> RDS >> Oracle

Hur man använder ROLLUP, RANK() med pivottabell i Oracle11g

Jag tror inte att dina intervall är helt rätt för frågan du har skrivit, även om ordalydelsen i uppgiften är tvetydig eftersom "mellan" är inkluderande - så som frågan är formulerad skulle en kreditpoäng på exakt 600 visas i båda de "lägre" och "genomsnittliga" parenteserna. Din version kommer att sätta 600 i den "nedre" parentesen, men det är diskutabelt vilken den ska vara i; Jag skulle tro att det borde vara "genomsnittligt" från de andra definitionerna, men det är oklart. Det finns ingen parentes i frågan för poäng mindre än 500, men om du har någon av dessa kommer din nuvarande kod att inkludera dem i den "genomsnittliga" parentesen, eftersom de är mindre än 700 men inte mellan 500 och 600.

Så jag skulle ha tolkat 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 frågarubrik hänvisar till ROLLUP, och för att få den totala raden kan du använda den funktionen:

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

Om du har några poäng under 500 kommer båda att inkludera en rad för de med creditscore_range som null; vilket är förvirrande med ROLLUP version. Du kanske vill filtrera bort alla poäng mindre än 500 från den innersta frågan, men återigen är det inte klart om det är nödvändigt eller önskvärt.

Jag är dock inte säker på att uppdraget är ute efter när det handlar om rankning. Det innebär att du ändrar kolumnordningen baserat på de värden de innehåller. Rangordning efter stat skulle vara mer meningsfullt om informationen vrids åt andra hållet.




  1. PHP mySQL kontrollera om användarnamn och lösenord finns i databasen

  2. Hur man skriver en SQL-fråga som sammanfogar flera rader från inmatningstabellen till en rad i utdatatabellen

  3. Hur kommer jag åt online mysql-databas i Android?

  4. Enkel syntax för 'skapa tabell från vy' i mysql?