Trong SQL thuần túy , nó sẽ cần nhiều mã hóa vì bạn sẽ phải đặt phạm vi theo cách thủ công vì không có mối quan hệ nào giữa các giá trị và phạm vi cả. Nếu đã có mối quan hệ, bạn có thể sử dụng CASE biểu thức và tạo phạm vi động .
SQL> WITH DATA AS
2 (SELECT 50 "1-99transval",
3 90 "100-200transval",
4 80 "200-300transval",
5 67 "1-99nontransval",
6 58 "100-200nontransval",
7 88 "200-300nontransval"
8 FROM dual
9 )
10 SELECT '1-99' range,
11 "1-99transval" transval,
12 "1-99nontransval" nontransval
13 FROM DATA
14 UNION
15 SELECT '100-200' range,
16 "100-200transval",
17 "100-200nontransval" nontransval
18 FROM DATA
19 UNION
20 SELECT '200-300' range,
21 "200-300transval",
22 "200-300nontransval" nontransval
23 FROM DATA;
RANGE TRANSVAL NONTRANSVAL
------- ---------- -----------
1-99 50 67
100-200 90 58
200-300 80 88
Từ cơ sở dữ liệu Oracle 11g phiên bản 1 trở lên, bạn có thể sử dụng UNPIVOT
SQL> WITH DATA AS
2 (SELECT 50 "1-99transval",
3 90 "100-200transval",
4 80 "200-300transval",
5 67 "1-99nontransval",
6 58 "100-200nontransval",
7 88 "200-300nontransval"
8 FROM dual
9 )
10 SELECT *
11 FROM DATA
12 UNPIVOT( (transval,nontransval)
13 FOR RANGE IN ( ("1-99transval","1-99nontransval") AS '1-99'
14 ,("100-200transval","100-200nontransval") AS '100-200'
15 ,("200-300transval","200-300nontransval") AS '200-300'));
RANGE TRANSVAL NONTRANSVAL
------- ---------- -----------
1-99 50 67
100-200 90 58
200-300 80 88
Ở trên, trong trường hợp của bạn, bạn cần thay thế VỚI mệnh đề với truy vấn hiện tại của bạn dưới dạng truy vấn phụ . Bạn cần đưa các cột khác vào UNION .
Trong PL / SQL , bạn có thể (ab) sử dụng THỰC HIỆN NGAY LẬP TỨC và lấy "phạm vi" bằng cách trích xuất tên cột trong sql động .
Mặc dù, sẽ tốt hơn nhiều nếu bạn sửa đổi / viết lại truy vấn hiện tại mà bạn chưa hiển thị.