0

有没有办法将 group by 应用或不应用到查询中?例如,我有这个:

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

只有当我在 Col3 中有值时,我才必须按 Col1 和 Col2 分组,如果 Col3 为空,我不需要对其进行分组。结果应该是:

Col1 Col2
A    20  
B    12   
B    12   

也许不是一个优雅的例子,但这就是想法。谢谢你。

4

3 回答 3

0

当 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
于 2012-11-20T17:02:32.180 回答
0

回复:有没有办法在查询中应用或不应用分组? 不是直接的,但是您可以通过分组将其分解,然后将结果联合在一起。

这行得通吗?

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 回答
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 回答