1

我试图创建一个从 Oracle 10g 中的表创建的数据透视表。

这是表结构:

创建表 KOMUNIKA.STOCK_AREA
(
  PRODUCT_CODE VARCHAR2(20 BYTE) NOT NULL,
  PRODUCT_NAME VARCHAR2(50 字节),
  AREA_CODE VARCHAR2(20 字节),
  AREA_NAME VARCHAR2(50 字节),
  数量(20,2)
)

我需要这些数据显示为:

名称 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
总计 56,941 72,891 118,574 55,868 46,758 19,813 60,246 431,091

然后我将使用 iBatis 框架获取结果,然后将其显示在 ExtJs Grid 中,如果有人和我有同样的问题并想分享它,这对我来说真的是很大的帮助。

我也已经找到了一些资源来开始:

http://www.sqlsnippets.com/en/topic-12200.html

但如果你们中的任何一个人已经找到了一个更简单的解决方案,你会节省我的周末:(,

谢谢你们

4

1 回答 1

1

您可以使用 CASE 表达式和 GROUP BY 在 SQL 本身中进行数据透视,只要结果中所需的列数是固定的(您不能编写会返回可变列数的 sql。

假设您的区域如下所示:

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;
于 2009-07-20T16:41:26.790 回答