sql >> Databáze >  >> RDS >> Oracle

Jak používat ROLLUP, RANK() s kontingenční tabulkou v Oracle11g

Nemyslím si, že vaše rozsahy jsou zcela správné pro dotaz, který jste napsali, ačkoli znění zadání je nejednoznačné, protože výraz „mezi“ zahrnuje – takže jak je otázka formulována, kreditní skóre přesně 600 by se objevilo v obou „dolní“ a „průměrné“ závorky. Vaše verze umístí 600 do 'spodní' závorky, ale je diskutabilní, která by měla být; Myslím, že by to mělo být „průměrné“ z ostatních definic, ale není to jasné. V otázce není žádná závorka pro skóre menší než 500, ale pokud nějaké z nich máte, váš aktuální kód je zahrne do „průměrné“ závorky, protože jsou menší než 700, ale ne mezi 500 a 600.

Takže bych to interpretoval 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)
);

Název vaší otázky odkazuje na ROLLUP a k získání celkového řádku můžete použít tuto funkci:

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

Pokud máte nějaké skóre pod 500, oba budou obsahovat řádek pro ty s creditscore_range jako null; což je matoucí s ROLLUP verze. Možná budete chtít odfiltrovat skóre menší než 500 z nejvnitřnějšího dotazu, ale opět není jasné, zda je to nutné nebo žádoucí.

Nejsem si jistý, že zadání hledá, když mluví o hodnocení. To znamená změnit pořadí sloupců na základě hodnot, které obsahují. Pořadí podle stavu by dávalo větší smysl, kdyby byla data otočena jiným způsobem.




  1. Jak mohu bezpečně uložit heslo v MySQL a ověřit se pro externí služby

  2. pomocí pyodbc na linuxu k vložení znaků unicode nebo utf-8 do pole nvarchar mssql

  3. postgresql nextval otázka na sekvence

  4. Co je nového v MariaDB Cluster 10.4