Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak używać ROLLUP, RANK() z tabelą przestawną w Oracle11g?

Nie sądzę, aby twoje zakresy były odpowiednie dla napisanego zapytania, chociaż sformułowanie przypisania jest niejednoznaczne, ponieważ „pomiędzy” jest inkluzywne – więc w przypadku sformułowania pytania wynik kredytowy równy 600 pojawi się w obu nawiasy „dolny” i „średni”. Twoja wersja umieści 600 w „dolnym” nawiasie, ale jest dyskusyjne, w którym miejscu; Myślę, że powinno to być „średnie” z innych definicji, ale jest to niejasne. W pytaniu nie ma nawiasu dla wyników mniejszych niż 500, ale jeśli masz którykolwiek z nich, twój obecny kod uwzględni je w nawiasie „średnim”, ponieważ są one mniejsze niż 700, ale nie między 500 a 600.

Zinterpretowałbym to jako:

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

Tytuł twojego pytania odnosi się do ROLLUP, a aby uzyskać całkowity wiersz, możesz użyć tej funkcji:

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

Jeśli masz jakiekolwiek wyniki poniżej 500, oba będą zawierać linię dla osób z creditscore_range jako null; co jest mylące z ROLLUP wersja. Możesz odfiltrować wszelkie wyniki poniżej 500 z najbardziej wewnętrznego zapytania, ale znowu nie jest jasne, czy jest to konieczne lub pożądane.

Nie jestem jednak pewien, czy zadanie szuka, gdy mówi o rankingu. Oznacza to zmianę kolejności kolumn na podstawie zawartych w nich wartości. Ranking według stanu byłby bardziej sensowny, gdyby dane zostały przesunięte w drugą stronę.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiedy wpisuję kod dateadd lub datediff, cały czas pojawia się ten błąd ORA-00904 DATEADD INVALID IDENTIFIER.

  2. jak zadeklarować % ROWTYPE zmiennej, która jest słabo wpisanym SYS_REFCURSOR?

  3. NLS_CHARSET_DECL_LEN() Funkcja w Oracle

  4. Procedura składowana Oracle i niestandardowy typ danych

  5. ORA-01002:pobierz poza sekwencją C++