Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да използвате ROLLUP, RANK() с обобщена таблица в Oracle11g

Не мисля, че диапазоните ви са съвсем подходящи за заявката, която сте написали, въпреки че формулировката на заданието е двусмислена, тъй като „между“ включва - така че както е формулиран въпросът, кредитен рейтинг от точно 600 ще се появи и в двете „долните“ и „средните“ скоби. Вашата версия ще постави 600 в "долната" група, но е спорно коя трябва да бъде; Мисля, че трябва да е „средно“ от другите определения, но не е ясно. Във въпроса няма скоби за резултати под 500, но ако имате някои от тях, тогава текущият ви код ще ги включи в групата „средни“, тъй като те са под 700, но не между 500 и 600.

Така че бих интерпретирал това като:

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

Заглавието на въпроса ви се отнася до РОБЪЛ и за да получите общия ред, можете да използвате тази функция:

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

Ако имате резултати под 500, тогава и двете ще включват ред за тези с creditscore_range като нула; което е объркващо с ROLLUP версия. Може да искате да филтрирате всички резултати под 500 от най-вътрешната заявка, но отново не е ясно дали това е необходимо или желателно.

Не съм сигурен обаче, че задачата търси, когато говори за класиране. Това предполага промяна на реда на колоните въз основа на стойностите, които съдържат. Класирането по състояние би имало по-голям смисъл, ако данните бяха обърнати в друга посока.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Обединяването на връзка с източник на данни на Oracle не работи, използва се с Spring и JDBCTemplate

  2. Spring Batch ORA-08177:не може да се сериализира достъпът за тази транзакция при изпълнение на едно задание, СЕРИАЛИЗИРАНО ниво на изолация

  3. Колона нееднозначно дефинирана

  4. Oracle SQL заявка за групиране на последователни записи

  5. къде трябва да сложа ресурси на инсталационната програма (wxs файл, dmg-script, икона) и как да конфигурирам maven antrun при внедряване на самостоятелно приложение