【问题标题】: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 我已经提到了上面的输出(第一个代码块)

标签: sql sql-server group-by sql-server-2014


【解决方案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])
    );
    

    【讨论】:

      猜你喜欢
      • 2012-07-11
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 2014-01-24
      相关资源
      最近更新 更多