1

以下の表の例では、2 つの状況でマークを超える金額を合計する方法を見つけようとしています。 id 内に存在します (id 1 または 2 を参照)。最初の状況では、その ID 内のマーク「A」に対する金額を除外したいと考えています (以下の変換テーブルの ID 3 を参照)。2 番目の状況では、除外を実行せず、マークに対する金額の単純な合計を取得します。

つまり、マーク「A」と「C」の両方を含むidの場合、「A」に対する金額をゼロにしたいのです。マーク「C」を含まないがマーク「A」を含む ID については、マーク「A」に対して元の金額を維持します。

私の望む出力は一番下にあります。ID でパーティション分割するか、EXISTS コマンドを使用することを検討しましたが、解決策を概念化するのに苦労しています。あなたの誰かが見て、私を正しい方向に向けることができれば、それは大歓迎です:)

例のテーブル:

id   mark  amount
------------------
1    A     1
2    A     3
2    B     2
3    A     1
3    C     3

希望の変換:

id   mark  amount
------------------
1    A     1
2    A     3
2    B     2
3    A     0
3    C     3

望ましい出力:

mark    sum(amount)
--------------------
A       4
B       2
C       3
4

2 に答える 2

1

あなたは私の前の答えを少し修正して、これで終わることができます:

SELECT
  mark,
  sum(amount) AS sum_amount
FROM atable t
WHERE mark <> 'A'
  OR NOT EXISTS (
    SELECT *
    FROM atable
    WHERE id = t.id
      AND mark = 'C'
  )
GROUP BY
  mark
;

SQLFiddleにライブデモがあります。

于 2012-11-01T06:46:45.740 に答える
0

試す:

select
    mark,
    sum(amount)
from ( select
        id,
        mark,
        case 
            when (mark = 'A' and id in (select id from table where mark = 'C')) then 0
            else amount
        end as amount
    from table ) t1
group by mark
于 2012-11-01T02:28:25.837 に答える