2

考虑下表结构

ADateTime    AGroupName   ARecordType   AValue
==========   ==========   ===========   ======
2013-01-01   Ninjas       A             10
2013-01-01   Ninjas       B             5
2013-01-01   Ninjas       C             2
2013-01-01   Ninjas       D             1
2013-01-01   Ninjas       E             0
2013-01-01   Clowns       A             8
2013-01-01   Clowns       B             4
2013-01-01   Clowns       E             1
2013-01-08   Ninjas       A             7
2013-01-08   Ninjas       B             3
2013-01-08   Ninjas       E             1
2013-01-08   Clowns       A             4
2013-01-08   Clowns       B             3

我需要为 ADateTime 和 AGroupName 的每个组合计算 2 个值(CalcVal1 和 CalcVal2)。换句话说,我需要 GROUP BY ADateTime 和 AGroupName (这是最简单的部分)。

注意:正如您从示例数据中看到的那样,不能保证给定分组会存在某种记录类型......所以如果/在必要时进行外部连接和合并!

我想弄清楚的是如何根据 ARecordType 的值计算 CalcVal1 和 CalcVal2。以下是 CalcVal1 和 CalcVal2 的规格...

  1. CalcVal1 是(AValue 的总和,其中 ARecordType='A')
  2. CalcVal2 是(AValue 的总和,其中 ARecordType IN ('B','C'))减去(AValue 的总和,其中 ARecordType IN ('D','E'))

我期望的结果集是

ADateTime    AGroupName   CalcVal1   CalcVal2
==========   ==========   ========   ========
2013-01-01   Ninjas       10            6
2013-01-01   Clowns       8             3
2013-01-08   Ninjas       7             2
2013-01-08   Clowns       4             3

我在 SQL-Server 2005 上使用 T-SQL。欢迎使用 SQL 或存储过程。TIA,我太老了,现在是他们让我成为 CTO 的时候了!(;-D)

4

1 回答 1

4

您可以使用条件聚合来做到这一点,几乎就像您描述的那样:

select ADateTime, AGroupName,
       SUM(case when ARecordType = 'A' then AValue else 0 end) as CalcVal1,
       (SUM(case when ARecordType in ('B', 'C') then AValue else 0 end) -
        SUM(case when ARecordType in ('D', 'E') then AValue else 0 end)
       ) as CalcVal2
from t
group by ADateTime, AGroupName
于 2013-07-10T01:10:22.153 回答