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