2015-09-02 3 views
1

У меня есть таблица с идентификатором, sub_id и значение coloumnsOracle SQL группы сумма

ID SUB_ID Value 
100 1 100 
100 2 150 
101 1 100 
101 2 150 
101 3 200 
102 1 100 

SUB идентификатор может отличаться от 1..maxvalue (В данном примере это 3). Мне нужна сумма значений для каждого Sub_ID. Если SUB_ID меньше MAXVALUE для идентификатора участника, тогда он должен принимать MAX (SUB_ID) каждого идентификатора. Как показано ниже (В этом примере для ID = 100 для SUB_ID 3 это должно быть 150, т.е. 2 < 3, поэтому значение = 150))

SUB_ID SUM(values) Remarks 
1   300   (100+100+100) 
2   400   (150+150+100) 
3   450   (150+200+100) 

Это легко сделать в PL/SQL. Можно ли использовать SQL для того же с помощью модели пункта или любые другие варианты

+0

Вы можете расширить ваш набор данных выше? Ваш текст указывает, что есть id = 100 и sub_id = 3, однако эта комбинация не существует в наборе данных. – Nick

+0

SUB_ID = 3 является максимальным SUB_ID для таблицы enitire. для ID = 100 это не происходит. Таким образом, он должен принимать значение Max SUB_ID для 100. Таким образом, он должен принимать 150. В случае 102 он должен принимать 100 –

+1

Есть ли только 3 суб_иды? Кроме того, можете ли вы разместить свой pl/sql, который делает эту логику? – Nick

ответ

2

SQL Fiddle

Oracle 11g R2 Настройка схемы:

CREATE TABLE TableA (ID, SUB_ID, Value) AS 
      SELECT 100, 1, 100 FROM DUAL 
UNION ALL SELECT 100, 2, 150 FROM DUAL 
UNION ALL SELECT 101, 1, 100 FROM DUAL 
UNION ALL SELECT 101, 2, 150 FROM DUAL 
UNION ALL SELECT 101, 3, 200 FROM DUAL 
UNION ALL SELECT 102, 1, 100 FROM DUAL 

запроса 1:

WITH sub_ids AS (
    SELECT LEVEL AS sub_id 
    FROM DUAL 
    CONNECT BY LEVEL <= (SELECT MAX(SUB_ID) FROM TableA) 
), 
max_values AS (
    SELECT ID, 
     MAX(VALUE) AS max_value 
    FROM TableA 
    GROUP BY ID 
) 
SELECT s.SUB_ID, 
     SUM(COALESCE(a.VALUE, m.max_value)) AS total_value 
FROM sub_ids s 
     CROSS JOIN 
     max_values m 
     LEFT OUTER JOIN 
     TableA a 
     ON (s.SUB_ID = a.SUB_ID AND m.ID = a.ID) 
GROUP BY 
     s.SUB_ID 

Results:

| SUB_ID | TOTAL_VALUE | 
|--------|-------------| 
|  1 |   300 | 
|  2 |   400 | 
|  3 |   450 | 
0

Попробуйте

SELECT SUB_ID,SUM(values), 
(SELECT DISTINCT SUBSTRING( 
( 
SELECT '+'+ CAST(values AS VARCHAR) 
    FROM table_Name AS T2 
WHERE T2.SUB_ID = d.SUB_ID   
FOR XML PATH ('') 
),2,100000)[values]) as values 
FROm table_Name d 
GROUP BY SUB_ID 
+0

Это похоже на SQL Server - вопрос отмечен Oracle. – MT0

0

Как о чем-то вроде этого:

select max_vals.sub_id, sum(nvl(table_vals.value,max_vals.max_value)) as sum_values 
from (
    select all_subs.sub_id, t1.id, max(t1.value) as max_value 
    from your_table t1 
    cross join (select sub_id from your_table) all_subs 
    group by all_subs.sub_id, t1.id 
) max_vals 
left outer join your_table table_vals 
on max_vals.id = table_vals.id 
and max_vals.sub_id = table_vals.sub_id 
group by max_vals.sub_id; 

Внутренний запрос получает вам список всех sub_id комбинаций/Ид и их значения отката. В запросе out используется nvl, чтобы использовать значение таблицы, если оно существует, и значение возврата, если оно отсутствует.

+0

OP заявила, что диапазон 'SUB_ID' от' 1 ... MAX' - это не будет устанавливать значения по умолчанию для 'SUB_ID', если он отсутствует для всех' ID '. – MT0

+0

OP также говорит, что sub_ids может отличаться. Я читал это, чтобы они могли быть в широком диапазоне, не обязательно, чтобы каждая ценность должна присутствовать. –

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