Рассчитать групповой результат и объединить его с деталями
Пожалуйста, рассмотрите этот результат (Отчет):
State Value1 Value2 Value3
---------------------------------------------
State1 103 23% 3
State2 105 32% 12
State3 150 2% 23
Group1 120 19% 3
===================
State4 200 40% 5
State5 250 2% 12
Group2 225 21% 8
===================
...
У меня есть группы, и каждая группа содержит несколько состояний. Нет, я хочу выполнить запрос к моим данным и запустить некоторые пользовательские функции для каждой группы, чтобы получить Value1
в Value3
, Для простоты рассмотрим AVG
функция.
я использую Group By
предложение для генерации состояния результата, но как я могу объединить группу состояний с моим результатом?
Спасибо
Редактировать 1)
это базовые данные, и они могут не совпадать с выводом выше:
Id StateName Value1 Value2 Value3
1 State1 1 2 3
2 State2 4 2 2
3 State2 3 3 8
4 State2 3 8 5
...
Редактировать 2)
Например:
State1, State2, State3 Belong to `Group1`
State4, state5 Belong to `Group2`
...
2 ответа
Я думаю, что вы смотрите, как показано ниже, я использовал функцию ROLLUP для достижения функциональности.
DECLARE @tblStates AS Table
(
GroupName VARCHAR(10),
StateName VARCHAR(50),
Value1 INT,
Value2 INT,
Value3 INT
)
INSERT INTO @tblStates VALUES('Group1','State1',103,23,3)
INSERT INTO @tblStates VALUES('Group1','State2',105,32,12)
INSERT INTO @tblStates VALUES('Group1','State3',150,2,23)
INSERT INTO @tblStates VALUES('Group2','State3',50,10,8)
INSERT INTO @tblStates VALUES('Group2','State4',80,22,1)
INSERT INTO @tblStates VALUES('Group2','State5',20,18,45)
;WITH T as
(
SELECT
GroupName,
StateName,
AVG(Value1) AS Value1,
AVG(Value2) AS Value2,
MIN(Value3) AS Value3
FROM @tblStates
GROUP BY ROLLUP(GroupName,StateName)
)
SELECT
CASE ISNULL(StateName,'') WHEN '' THEN GroupName ELSE StateName END AS StateName,
Value1,
Value2,
Value3
FROM T
WHERE
T.GroupName IS NOT NULL
ORDER BY GroupName
Выход:
Я думаю, вы ищете наборы для группировки. Эта функциональность позволяет выполнять агрегирование в одном выражении, группируя по разным значениям в одном и том же GROUP BY
пункт.
Итак, я думаю, вам нужно что-то вроде этого (сначала добавьте в свои данные, к какой группе оно принадлежит):
Id StateName Value1 Value2 Value3 Group
1 State1 1 2 3 Group01
2 State2 4 2 2 Group01
3 State2 3 3 8 Group01
4 State4 3 8 5 Group02
...
Тогда у вас будет:
SELECT ISNULL([Group],[StateName])
,AVG()
FROM ...
GROUP BY GROUPING SETS
(
([Group])
,([Group], [StateName])
);