Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách sử dụng ROLLUP, RANK () với bảng tổng hợp trong Oracle11g

Tôi không nghĩ rằng phạm vi của bạn hoàn toàn phù hợp với truy vấn bạn đã viết, mặc dù từ ngữ của bài tập không rõ ràng vì 'giữa' là bao gồm - vì vậy khi câu hỏi được viết, điểm tín dụng chính xác là 600 sẽ xuất hiện trong cả hai dấu ngoặc "thấp hơn" và "trung bình". Phiên bản của bạn sẽ đặt 600 trong khung 'thấp hơn', nhưng nó còn gây tranh cãi nên đặt nó ở đâu; Tôi nghĩ rằng nó phải là 'trung bình' so với các định nghĩa khác, nhưng nó không rõ ràng. Không có dấu ngoặc nào trong câu hỏi cho điểm dưới 500, nhưng nếu bạn có bất kỳ điểm nào trong số đó thì mã hiện tại của bạn sẽ đưa chúng vào khung 'trung bình', vì chúng nhỏ hơn 700 chứ không phải từ 500 đến 600.

Vì vậy, tôi đã giải thích điều đó là:

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

Tiêu đề câu hỏi của bạn đề cập đến ROLLUP và để có tổng hàng, bạn có thể sử dụng hàm đó:

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

Nếu bạn có bất kỳ điểm nào dưới 500 thì Cả hai sẽ bao gồm một dòng cho những người có creditscore_range as null; gây nhầm lẫn với ROLLUP phiên bản. Bạn có thể muốn lọc bất kỳ điểm nào nhỏ hơn 500 ra khỏi truy vấn trong cùng, nhưng một lần nữa, không rõ điều đó có cần thiết hay mong muốn hay không.

Tôi không chắc rằng bài tập đang tìm kiếm khi nó nói về xếp hạng. Điều đó ngụ ý thay đổi thứ tự cột dựa trên các giá trị mà chúng chứa. Xếp hạng theo tiểu bang sẽ có ý nghĩa hơn nếu dữ liệu được xoay vòng theo cách khác.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thiết lập tối thiểu cần thiết để triển khai ứng dụng .NET với máy khách Oracle 11 là gì?

  2. LỖI:Tham chiếu bộ đếm là mục tiêu của một phép gán - PL / SQL

  3. Truyền mảng từ Java sang Oracle:java.sql.SQLException:Không chuyển đổi được thành biểu diễn nội bộ:lỗi

  4. Thời gian dài tìm nạp dữ liệu từ OracleDB bằng Eclipselink

  5. Một bảng vẫn tồn tại khi bị rơi