2016-05-09 2 views
-4

Первый раз здесь, надеюсь, что кто-то может помочьOracle SQL регулярное_выражение сумма в повторяющейся последовательности, сгруппированные по

Что Oracle SQL выберите STMT для XML ниже хранятся в CLOB поле Oracle поэтому следующий возвращается (там будет как многие из них составляют 96 блоков intvColl в день).

В основном числовые значения в блоках intvColl между 2-й и 3-й запятыми должны быть суммированы и сгруппированы по дате перед первой запятой, а также по varchar после третьей запятой.

Я предполагаю regexp_substr /, но не могу туда добраться. Первая запись сумма 1-го и 2-го блоков intvColl Вторая запись является суммой 3-го intvColl блока Третья запись является суммой 4-го и 5-го

MeterChannelID   Date   Sum  Quality Count_of_records 
6103044759-40011200-Q1 14/03/2016 1,387 A   2 
6103044759-40011200-Q1 14/03/2016  694 S   1 
6103044759-40011200-Q1 15/03/2016 1,433 A   2 

<uploadRegData> 
    <intervalDataBlock> 
     <setDateTime>16/03/2016-19:30:01</setDateTime> 
     <intervalMinute>15</intervalMinute> 
     <meterChannelID>6103044759-40011200-Q1</meterChannelID> 
     <intvColl><intvData>14/03/2016,1,700,A</intvData></intvColl> 
     <intvColl><intvData>14/03/2016,2,687,A</intvData></intvColl> 
     <intvColl><intvData>14/03/2016,3,694,S</intvData></intvColl> 
     <intvColl><intvData>15/03/2016,4,724,A</intvData></intvColl> 
     <intvColl><intvData>15/03/2016,5,709,A</intvData></intvColl> 
    </intervalDataBlock> 
</uploadRegData> 
+0

Пожалуйста, добавьте некоторые более подробную информацию, чтобы сделать ваш вопрос более ясным; кроме того, что вы пробовали до сих пор и с какой проблемой вы сталкиваетесь? – Aleksej

+0

Привет, Elgood, добро пожаловать в SO. Ваш вопрос не очень ясен. Вы должны потратить время, чтобы помочь людям понять, чего вы хотите. Здесь совсем не ясно, что вы ожидаете, что ваше решение суммирует некоторый компонент XML. И вы также должны показать, что вы провели собственное исследование и продемонстрировали усилия по его решению. Здесь это скорее похоже на вопрос «сделай мою домашнюю работу». –

ответ

0
SELECT MeterChannelID, 
     "Date", 
     SUM(value) AS "Sum", 
     Quality, 
     COUNT(1) AS Count_of_Records 
FROM (
    SELECT MeterChannelID, 
     TO_DATE(SUBSTR(data, 1, 10), 'DD/MM/YYYY') AS "Date", 
     TO_NUMBER(SUBSTR(
         data, 
         INSTR(data, ',', 1, 2), 
         LENGTH(data) - INSTR(data, ',', 1, 2) - 2 
       )) AS value, 
     SUBSTR(data, -1) AS Quality 
    FROM (
    SELECT EXTRACTVALUE(xml, '/uploadRegData/intervalDataBlock/meterChannelId') 
      AS MeterChannelID, 
      EXTRACTVALUE(d.COLUMN_VALUE, '/intvData') AS data 
    FROM (SELECT XMLType(column_name) AS xml FROM table_name) x, 
      TABLE(
      XMLSequence(
       EXTRACT(
       x.xml, 
       '/uploadRegData/intervalDataBlock/intvCol1/intvData' 
       ) 
      ) 
      ) d 
) 
) 
GROUP BY MeterChannelID, "Date", Quality 
ORDER BY MeterChannelID, "Date", Quality; 
+0

Спасибо, я медленно с этим справляюсь – Elgood

+0

Я запускаю это – Elgood

+0

Я могу заставить это работать на Oracle 12, возвращает ORA-00904: «X». «XML»: недопустимый идентификатор 00904. 00000 - «% s: недопустимый идентификатор « – Elgood

Смежные вопросы