2

最後の行として合計 (または平均などのその他の操作) を含む SQL 選択クエリに行を追加しようとしています。これは、GROUP BY ... WITH ROLLUP に似たものです。

まず、フィールド ID、A、B、C を持つテーブル t があり、これらはすべて数値であるとします。また、ID は一意ではなく、カテゴリです。私の SELECT クエリは、指定された範囲内にこれらの数値がいくつあるかをカウントすることになっています。

したがって、たとえば、最終結果は次のようになります。

(SELECT t.ID, a.ac, b.bc, c.cc FROM t
LEFT JOIN (SELECT COUNT(*) cc,ID FROM t WHERE A BETWEEN 2 AND 4 GROUP BY ID) AS a ON a.ID=t.ID 
LEFT JOIN (SELECT AVG(B) cc,ID FROM t WHERE B BETWEEN 19 AND 40 GROUP BY ID) AS b ON b.ID=t.ID 
LEFT JOIN (SELECT COUNT(*) cc,ID FROM t WHERE C BETWEEN 12 AND 14 GROUP BY ID) AS c ON a.ID=t.ID GROUP BY t.ID) 

union 

(select 'Overall',
 (SELECT COUNT(*) cc FROM t WHERE A BETWEEN 2 AND 4),
 (SELECT AVG(B) cc FROM t WHERE B BETWEEN 19 AND 40),
 (SELECT COUNT(*) cc FROM t WHERE C BETWEEN 12 AND 14) );

ただし、このソリューションは理想的ではありません。A、B、および C の条件を再度指定する必要があるためです。条件を 1 回だけ指定して同じ結果を達成する簡単な方法があるかどうかを知りたいです。

前もって感謝します。

4

2 に答える 2

2

さて、あなたができる平均なしで:

SELECT t.ID,
       count(case when A between 2 and 4 then ID end),
       AVG(case when B between 19 and 40 then B end),
       COUNT(case when C between 12 and 14 then id end)
FROM t
GROUP BY ID with rollup

私は次のように書きます:

SELECT t.ID,
       sum(case when A between 2 and 4 then 1 else 0 end),
       sum(case when B between 19 and 40 then B end)/sum((case when B between 19 and 40 then B end),
       sum(case when C between 12 and 14 then 1 else end)
FROM t
GROUP BY ID with rollup

ロールアップがavgでどのように機能するかわからないため、最終バージョンは次のとおりです。

select coalesce(t.ID, 'Overall'), Acnt,
       (case when Bcnt > 0 then Bsum/Bcnt end),
       Ccnt
from (select t.ID,
             sum(case when A between 2 and 4 then 1 else 0 end) as Acnt,
             sum(case when B between 19 and 40 then B end) as Bsum,
             sum(case when B between 19 and 40 then B end) as Bcnt,
             sum(case when C between 12 and 14 then 1 else end) as Ccnt
      FROM t
      GROUP BY ID with rollup
     ) t
于 2012-12-13T02:41:23.763 に答える
2

もっと簡単な解決策はないと思います。しかし、私はあなたのクエリを次のように書き直します:

SELECT
  t.ID,
  count(case when A between 2 and 4 then ID end),
  AVG(case when B between 19 and 40 then B end),
  COUNT(case when C between 12 and 14 then id end)
FROM t
GROUP BY ID
UNION
select
  'Overall',
  count(case when A between 2 and 4 then ID end),
  AVG(case when B between 19 and 40 then B end),
  COUNT(case when C between 12 and 14 then id end)
FROM t
于 2012-12-12T23:21:57.143 に答える