Lokesh Zende Ответов: 2

Получить сумму значений для другой строки в группе В SQL.


У меня есть таблица Parameter_List с полями Parameter_ID,Parameters_Name, Target_Value, GroupID.
Значения могут быть следующими
Parameter_ID    Parameters_Name Target_Value    GroupID Sequence_No
1   Para_1  1000    2   1
2   Para_2  2000    2   2
3   Para_3  3000    2   3
4   Para_4  NULL    2   4
5   Para_5  5000    2   5

6   Para_1  1450    3   1
7   Para_2  1200    3   2
8   Para_4  NULL    3   3
9   Para_5  3000    3   4

10  Para_2  3000    4   1
11  Para_3  4000    4   2
12  Para_4  NULL    4   3


Как вы можете видеть, Target_Value для Para_4 всегда равен нулю.
Теперь, когда я хочу отобразить записи, я хочу, чтобы значение для Para_4 было равно сумме Target_Value параметров выше Para_4 для этой группы.
Например, для GroupID 2 значение Para_4 должно быть суммой первых 3 строк. Таблица имеет столбец Sequence_No. Таким образом, Para_4 должен иметь Target_Value как сумму всех строк над ним в этой конкретной группе.
Надо группы группы. Таким образом, результат будет выглядеть следующим образом
Para_1  1000    2
Para_2  2000    2
Para_3  3000    2
Para_4  6000    2
Para_5  5000    2

Para_1  1450    3
Para_2  1200    3
Para_4  2650    3
Para_5  3000    3


Что я уже пробовал:

Я пытался использовать UNION, но я не думаю, что это хорошее решение (или это так?). Как это влияет на производительность?

2 Ответов

Рейтинг:
18

Maciej Los

Этого можно достичь с помощью приведенного ниже оператора sql:

SELECT T.Parameters_Name, SUM(T.Target_Value) AS Target_Value, T.GroupID
FROM (
  SELECT 'Para_4' AS Parameters_Name, Target_Value, GroupID
  FROM Tmp
  WHERE Parameters_Name IN ('Para_1', 'Para_2', 'Para_3')
  UNION ALL
  SELECT Parameters_Name, Target_Value, GroupID
  FROM Tmp
  WHERE Parameters_Name <> 'Para_4'
) AS T
GROUP BY T.Parameters_Name, T.GroupID


Скрипка SQL[^]

Примечание: В случае, если Para_4 это всегда так NULL, ля WHERE пункт второй SELECT утверждение излишне .


Рейтинг:
0

kirthiga S

Declare @table table(Parameter_ID int,Parameters_Name varchar(10),Target_Value int,GroupID int,Sequence_No int)
insert into @table values
(1,   'Para_1',  1000,    2,   1),
(2,   'Para_2',  2000,    2,   2),
(3,   'Para_3',  3000,    2,   3),
(4,   'Para_4',  NULL,    2,   4),
(5,   'Para_5',  5000,    2,   5),
								 
(6,   'Para_1',  1450,    3,   1),
(7,   'Para_2',  1200,    3,   2),
(8,   'Para_4',  NULL,    3,   3),
(9,   'Para_5',  3000,    3,   4),
								 
(10,  'Para_2',  3000,    4,   1),
(11,  'Para_3',  4000,    4,   2),
(12,  'Para_4',  NULL,    4,   3)

select *,sum(Target_Value)over(partition by GroupID order by Sequence_No)Tot from @table order by Parameter_ID