计算组结果并将其与详细信息合并

Posted

技术标签:

【中文标题】计算组结果并将其与详细信息合并【英文标题】:Calculate group result and merge it with details 【发布时间】:2018-02-06 07:03:58 【问题描述】:

请考虑这个结果(报告):

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
===================
...

我有组,每个组都包含一些状态。不,我想对我的详细信息数据运行查询并在每个组上运行一些自定义函数以获得Value1Value3。为简单起见,请考虑 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`
...

【问题讨论】:

请提供示例数据(DDL)。 这个输入你需要什么输出? 你当前的 T-SQL 语句是什么? 你如何应用组,在哪一列? @PawanKumar 我已经提到了上面的输出(第一个代码块) 【参考方案1】:

我认为您正在查看以下内容,我已使用 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

输出:

【讨论】:

【参考方案2】:

我猜你正在寻找GROUPING SETS。此功能允许您在一个语句中执行聚合,按同一 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])
);

【讨论】:

以上是关于计算组结果并将其与详细信息合并的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个 gremlin 查询中将两个顶点详细信息和边属性详细信息合并在一起

如何在 Firebase 颤振应用程序中合并两个集合?

如何从 firestore 两个集合中获取数据并将所有数据合并在一起

详细教程一文参透MongoDB聚合查询

Python 为啥我的列表只能识别一组登录详细信息?

Python列表的常用操作- 查找方法【详细讲解】