我尝试创建一个从Oracle 10g中的表创建的数据透视表。
这是表结构:
CREATE TABLE KOMUNIKA.STOCK_AREA ( PRODUCT_CODE VARCHAR2(20 BYTE) NOT NULL, PRODUCT_NAME VARCHAR2(50 BYTE), AREA_CODE VARCHAR2(20 BYTE), AREA_NAME VARCHAR2(50 BYTE), QUANTITY NUMBER(20,2) )
我需要将这些数据显示为:
Name US Europe Asia SthAm Aust Africa Rest Total
C 2601 156 86 437 27 279 22 708 1,715
C 2605 926 704 7,508 1,947 982 782 1,704 14,553
Total 56,941 72,891 118,574 55,868 46,758 19,813 60,246 431,091
然后我将使用iBatis框架获取结果,然后将其显示在ExtJs网格中,如果有人遇到与我相同的问题并希望分享它,那对我来说真的很受欢迎。
我也已经找到了一些资源:
http://www.sqlsnippets.com/en/topic-12200.html
但如果你们中的任何一个人已经找到了一个更简单的解决方案,你将保存我的周末:(,
谢谢大家
答案 0 :(得分:1)
您可以使用CASE表达式和GROUP BY在SQL本身中执行数据透视,只要结果中所需的列数得到修复(您无法编写将返回可变数量的列的SQL。< / p>
假设你的区域是这样的:
AREA_CODE AREA_NAME
--------- ---------
101 US
102 Europe
103 Asia
104 South America
105 Australia
106 Africa
107 ...
108 ...
您可以编写一个返回上述结果的查询:
SELECT PRODUCT_NAME
, SUM(CASE WHEN AREA_CODE = 101
THEN QUANTITY ELSE 0 END) US
, SUM(CASE WHEN AREA_CODE = 102
THEN QUANTITY ELSE 0 END) Europe
, SUM(CASE WHEN AREA_CODE = 103
THEN QUANTITY ELSE 0 END) Asia
, SUM(CASE WHEN AREA_CODE = 104
THEN QUANTITY ELSE 0 END) SthAm
, SUM(CASE WHEN AREA_CODE = 105
THEN QUANTITY ELSE 0 END) Aust
, SUM(CASE WHEN AREA_CODE = 106
THEN QUANTITY ELSE 0 END) Africa
, SUM(CASE WHEN AREA_CODE NOT IN (101, 102, 103, 104, 105, 106)
THEN QUANTITY ELSE 0 END) Rest
, SUM(QUANTITY) Total
FROM KOMUNIKA.STOCK_AREA
GROUP BY PRODUCT_NAME;