Belows are the xml data stored in a field call xmldoc with data type XMLTYPE and the pattern are stored in each record.
The first row(record) of the xmldoc field should be:
<cdata>
<r> <year>2009</year>
<month>Jan</month>
<day>1</day>
<data>1180</data>
</r>
</cdata>
and the second row of the xmldoc field should be:
<cdata>
<r>
<year>2009</year>
<month>Jan</month>
<day>2</day>
<data>1280</data>
</r>
</cdata>
and the belowed xml datas are also modified into the upper example (each data stored in a row record in xmldoc field and embedded a ‘cdata’ root element.)
<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>
now, i use this 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
order by x.year, x.month
i can get the sum of ‘data’ by each month in each year from this sql and the question i would like to know is how to display the sum of each year after the column sumMonth and just modify this sql but not use two or more sql to get the aggregation of month and year in same time.
the output maybe like this:
year month sumMonth sumYear
2009 Jan 3840 10680
2009 Feb 6840 10680
2010 Jan 3843 10686
2010 Feb 6843 10686
thanks everyone gave me the answer 🙂
You could use an analytic function: