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

Oracle10G SQL:Chuyển các cột thành hàng

Nếu bạn đang sử dụng 11G, bạn có thể sử dụng unpivot :

SELECT subject, AVG(percentage) AS percentage
FROM (
    SELECT * FROM tablea
    UNPIVOT (percentage FOR subject IN (math, science, computer))
)
GROUP BY subject
ORDER BY subject;

SUBJECT  PERCENTAGE
-------- ----------
COMPUTER      94.33
MATH          91.33
SCIENCE       87.33

Nhưng vì bạn không phải là bạn, bạn có thể giả mạo nó. Điều chỉnh từ trang web này :

SELECT subject, AVG(percentage) AS percentage
FROM (
    SELECT DECODE(unpivot_row, 1, 'Math',
                               2, 'Science',
                               3, 'Computer') AS subject,
           DECODE(unpivot_row, 1, math,
                               2, science,
                               3, computer) AS percentage
    FROM tablea
    CROSS JOIN (SELECT level AS unpivot_row FROM dual CONNECT BY level <= 3)
)
GROUP BY subject
ORDER BY subject;

SUBJECT  PERCENTAGE
-------- ----------
Computer      94.33
Math          91.33
Science       87.33

Trong cả hai trường hợp, select bên trong là chuyển đổi hàng thành cột; trong 10g bạn chỉ cần làm điều đó cho mình. SELECT ... CONNECT BY ... chỉ tạo danh sách các giá trị giả và điều này phải có đủ để bao gồm số cột bạn đang chuyển đổi thành hàng (và nếu bạn thực sự có 1000, bạn thực sự nên truy cập lại mô hình dữ liệu). Hai decode các câu lệnh sử dụng số được tạo đó để so khớp với tên và giá trị cột - tự chạy lựa chọn bên trong để tìm ra nó trông như thế nào.

Nếu không sử dụng SQL động, bạn không thể tránh khỏi việc phải liệt kê các cột - chỉ một lần với unpivot thực , nhưng hai lần với phiên bản 10g giả và bạn phải đảm bảo chúng khớp đúng cách và trình tạo số hàng đang tạo ra đủ giá trị. (Quá nhiều và bạn có thể nhận được kết quả kỳ lạ, nhưng vì bất kỳ giá trị bổ sung nào sẽ không có giá trị ở đây và bạn đang sử dụng avg , nó không quan trọng quá trong trường hợp này; giống như một cuộc kiểm tra sự tỉnh táo, bạn có thể nên làm cho nó khớp chính xác).

Hoặc một phiên bản khác, dựa trên việc bạn luôn muốn tất cả các cột ngoại trừ name , có nghĩa là bạn chỉ cần liệt kê các cột bạn muốn một lần và dễ dàng hơn để khớp chúng một cách trực quan - chỉ cần tiếp tục thêm when điều khoản; và bạn không cần số hàng:

SELECT subject, AVG(percentage) AS percentage
FROM (
    SELECT column_name AS subject,
        CASE
            WHEN column_name = 'MATH' then math
            WHEN column_name = 'SCIENCE' then science
            WHEN column_name = 'COMPUTER' then computer
        END AS percentage
    FROM tablea
    CROSS JOIN (
        SELECT column_name
        FROM user_tab_columns
        WHERE table_name = 'TABLEA'
        AND column_name != 'NAME'
    )
)
GROUP BY subject
ORDER BY subject;

SUBJECT                        PERCENTAGE
------------------------------ ----------
COMPUTER                            94.33
MATH                                91.33
SCIENCE                             87.33



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Việc chọn trường riêng biệt và số hàng chỉ để hiển thị số id sẽ cung cấp dữ liệu trùng lặp

  2. Cách đồng bộ hóa một phương thức java được gọi bằng PL / SQL

  3. Tập lệnh để tìm các phụ thuộc nhiều cấp của một gói

  4. Sự cố khi cố gắng chạy gói SSIS với Oracle Connection Attunity

  5. Nhận số ngày liên tiếp đáp ứng một tiêu chí nhất định