Как несколько агрегировать из поля XMLTYPE в течение 1 sql? - PullRequest
1 голос
/ 13 марта 2012

Ниже приведены данные xml, хранящиеся в вызове поля xmldoc с типом данных XMLTYPE, а шаблон хранится в каждой записи.

Первая строка (запись) поля xmldoc должна быть:

<cdata>
<r> <year>2009</year>
<month>Jan</month>
<day>1</day>
<data>1180</data>
</r>
</cdata>

, а вторая строка поля xmldoc должна быть:

<cdata>
<r>
<year>2009</year>
<month>Jan</month>
<day>2</day>
<data>1280</data>
</r>
</cdata>

, а приведенные ниже данные xml также модифицируются в верхнем примере (все данные сохраняются в записи строки в поле xmldoc и внедряютсякорневой элемент 'cdata'.)

<r>
<year>2009</year>
<month>Jan</month>
<day>3</day>
<data>1380</data>
</r>
<r>
<year>2009</year>
<month>Feb</month>
<day>1</day>
<data>2180</data>
</r>
<r>
<year>2009</year>
<month>Feb</month>
<day>2</day>
<data>2280</data>
</r>
<r>
<year>2009</year>
<month>Feb</month>
<day>3</day>
<data>2380</data>
</r>
<r>
<year>2010</year>
<month>Jan</month>
<day>1</day>
<data>1181</data>
</r>
<r>
<year>2010</year>
<month>Jan</month>
<day>2</day>
<data>1281</data>
</r>
<r>
<year>2010</year>
<month>Jan</month>
<day>3</day>
<data>1381</data>
</r>
<r>
<year>2010</year>
<month>Feb</month>
<day>1</day>
<data>2181</data>
</r>
<r>
<year>2010</year>
<month>Feb</month>
<day>2</day>
<data>2281</data>
</r>
<r>
<year>2010</year>
<month>Feb</month>
<day>3</day>
<data>2381</data>
</r>

Теперь я использую этот sql:

SELECT X.year, x.month, sum(x.data) as sumMonth
FROM xmltest, 
XMLTABLE ('$d/cdata/r' passing xmldoc as "d" 
   COLUMNS 
  year integer path 'year',
  month varchar(3) path 'month',
  day varchar(2) path 'day',
  data float path 'data'
  ) AS X
group by x.year, x.month

заказ по x.year, x.month

я могуполучить сумму «данных» за каждый месяц каждого года из этого sql, и вопрос, который я хотел бы знать, состоит в том, как отобразить сумму каждого года после столбца sumMonth и просто изменить этот sql, но не использовать два илибольше sql , чтобы получить агрегацию по месяцу и году в одно и то же время.

вывод может быть таким:

year month  sumMonth sumYear
2009  Jan    3840     10680
2009  Feb    6840     10680
2010  Jan    3843     10686
2010  Feb    6843     10686

спасибо, что все дали мне ответ:)

1 Ответ

0 голосов
/ 13 марта 2012

Вы можете использовать аналитическую функцию :

SELECT v.YEAR, v.MONTH, v.sumMonth, 
       SUM(v.sumMonth) over(PARTITION BY v.YEAR) sumYear
  FROM (SELECT X.YEAR, x.MONTH, SUM(x.data) AS sumMonth
           FROM xmltest,
                XMLTABLE('$d/cdata/r' passing xmldoc AS "d" 
                  COLUMNS YEAR INTEGER path 'year',
                          MONTH VARCHAR(3) path 'month',
                          DAY VARCHAR(2) path 'day',
                          data FLOAT path 'data') AS X
          GROUP BY x.YEAR, x.MONTH) v
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...