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) を計算する必要があります。つまり、ADateTime と AGroupName で GROUP BY する必要があります (これは簡単な部分です)。

注: サンプル データからわかるように、特定のグループ化に対して特定のレコード タイプが存在するという保証はありません。そのため、必要に応じて外部結合と合体を行ってください。

私が理解しようとしているのは、ARecordType の値に応じて CalcVal1 と CalcVal2 を計算する方法です。以下は、CalcVal1 と CalcVal2 の仕様です...

  1. CalcVal1 は (ARecordType='A' の AValue の合計) です。
  2. CalcVal2 は (ARecordType IN ('B','C') の AValue の合計) MINUS (ARecordType IN ('D','E') の AValue の合計) です。

私が期待する結果セットは

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 に答える