当 col3 不为空时,听起来您想要 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 值,则 group by 的第二个子句始终评估为 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