动态分组在查询中

时间:2012-11-20 16:52:40

标签: sql

有没有办法在查询中应用或不应用组?例如,我有这个:

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   

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

3 个答案:

答案 0 :(得分: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值,则组的第二个子句总是计算为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

答案 1 :(得分:0)

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

这有用吗?

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

答案 2 :(得分:0)

这是一个符合你想要的SQL小提琴: 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))