sql >> Database >  >> RDS >> Oracle

Hoe ROLLUP, RANK() te gebruiken met draaitabel in Oracle11g

Ik denk niet dat je bereik helemaal klopt voor de vraag die je hebt geschreven, hoewel de bewoording van de opdracht dubbelzinnig is omdat 'tussen' inclusief is - dus als de vraag is geformuleerd, zou een credit score van precies 600 verschijnen in beide de 'lagere' en 'gemiddelde' haakjes. Uw versie zal 600 in de 'lagere' haak plaatsen, maar het is discutabel welke het zou moeten zijn; Ik zou denken dat het 'gemiddeld' zou moeten zijn van de andere definities, maar het is onduidelijk. Er is geen haakje in de vraag voor scores van minder dan 500, maar als je een van deze hebt, dan zal je huidige code ze opnemen in het 'gemiddelde' haakje, aangezien ze minder dan 700 zijn, maar niet tussen 500 en 600.

Dus ik zou dat hebben geïnterpreteerd 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)
);

De titel van uw vraag verwijst naar ROLLUP, en om de totale rij te krijgen, kunt u die functie gebruiken:

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

Als je scores lager dan 500 hebt, dan zal Beide een regel bevatten voor degenen met de creditscore_range als nul; wat verwarrend is met de ROLLUP versie. Misschien wilt u scores van minder dan 500 uit de binnenste zoekopdracht filteren, maar nogmaals, het is niet duidelijk of dat nodig of wenselijk is.

Ik weet echter niet zeker of de opdracht zoekt als het over ranking gaat. Dat betekent dat de kolomvolgorde moet worden gewijzigd op basis van de waarden die ze bevatten. Rangschikken op staat zou logischer zijn als de gegevens de andere kant op waren gedraaid.




  1. Oracle outer join met filtervoorwaarde in de tweede tabel

  2. Rijverschuiving in SQL Server

  3. SQL Bereken het gemiddelde tijdsverschil tussen de totale rijen

  4. TSQL Decimaal getal naar boven afronden