0

group byをクエリに適用する方法はありますか?たとえば、私はこれを持っています:

Col1 Col2 Col3
A    10   X
A    10   NULL
B    12   NULL 
B    12   NULL

Col3に値がある場合にのみ、Col1とCol2でグループ化する必要があります。Col3がnullの場合、グループ化する必要はありません。結果は次のようになります。

Col1 Col2
A    20  
B    12   
B    12   

たぶんエレガントな例ではありませんが、これはアイデアです。ありがとうございました。

4

3 に答える 3

0

col3がnullでない場合、col1のすべての一意の値が必要なようです。それ以外の場合は、col1のすべての値が必要です。

ウィンドウ関数をサポートするSQLエンジンがあるとすると、これは次のように実行できます。

select col1, sum(col2)
from (select t.*,
             count(col3) over (partition by col1) as NumCol3Values,
             row_number() over (partition by col1 order by col1) as seqnum
       from t
     ) t
group by col1,
         (case when NumCol3Values > 1 then NULL else seqnum end)

論理はあなたがそれを述べるのとほとんど同じです。NULL以外の値がある場合、groupbyの2番目の句は常にNULLと評価されます。すべてが同じグループに含まれます。すべてがNULLの場合、句はシーケンス番号に評価され、各値が別々の行に配置されます。

これは、ウィンドウ関数がないと少し難しくなります。列3の最小値(NULLでない場合)が一意であると仮定すると、次のように機能します。

select t.col1,
       (case when minCol3 is null then tsum.col2 else t.col2 end) as col2
from t left outer join
     (select col1, sum(col2) as col2, 
             min(col3) as minCol3
      from t
     ) tsum
     on t.col1 = tsum.col1
where minCol3 is NULL or t.col3 = MinCol3
于 2012-11-20T17:02:32.180 に答える
0

ここにあなたが望むことをするSQL Fiddleがあります: http://sqlfiddle.com/#!3/b7f07/2

SQL自体は次のとおりです。

SELECT col1, sum(col2) as col2 FROM dataTable WHERE 
col1 in (SELECT col1 from dataTable WHERE col3 IS NOT NULL)
GROUP BY col1
UNION ALL
SELECT col1, col2 FROM dataTable WHERE
(col1 not in 
 (SELECT col1 from dataTable WHERE col3 IS NOT NULL and col1 is not null))
于 2012-11-20T17:17:25.140 に答える
0

re: group by をクエリに適用する方法と適用しない方法はありますか? 直接ではありませんが、グループ化して分割し、結果を一緒に UNION することができます。

これは機能しますか?

Select col1, sum(col2)
from table
group by col1, col2
having max(col3) is not null

union all

select col1, col2
from table t left outer join
 (Select col1, col2
 from table
 group by col1, col2
 having max(col3) is not null) g
where g.col1 is null
于 2012-11-20T17:11:39.373 に答える