Кросс-таблица / сводный запрос в Oracle PL / SQL - iBatis - Extjs и JasperReport - PullRequest
1 голос
/ 17 июля 2009

Я попытался создать сводную таблицу, созданную из таблицы в 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 <br/>
C 2601   156     86      437     27      279     22      708     1,715 <br/>
C 2605   926     704     7,508   1,947   982     782     1,704   14,553 <br/>
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

но если кто-то из вас уже нашел более простое решение, вы сохраните мои выходные :(,

спасибо всем

1 Ответ

1 голос
/ 20 июля 2009

Вы можете сделать сводку в самом SQL, используя выражения CASE и GROUP BY, при условии, что число столбцов, которое вы хотите получить в результате, фиксировано (вы не можете написать 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;
...