Рассчитать групповой результат и объединить его с деталями

Пожалуйста, рассмотрите этот результат (Отчет):

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])
);
Другие вопросы по тегам