Sql 查询中的动态分组依据

Sql 查询中的动态分组依据,sql,Sql,有没有一种方法可以将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 也许这不是一个优雅的例子,但这是一个想法。 谢谢。听起来,当col3不为n

有没有一种方法可以将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   
也许这不是一个优雅的例子,但这是一个想法。
谢谢。

听起来,当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值,那么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
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

下面是一个SQL FIDLE,它可以满足您的需要:

下面是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))

如果Col3中至少有一个值不为null,则需要按Col1和Col2分组?看起来您的输出与您的要求不匹配,考虑到Col3为null,为什么要对记录A进行分组是的。谢谢。因为至少有一个Col3值不是空的,我想tr3是想说一句合理的话,但是只要在where子句中使用一个过滤器来删除空Col3(Col3不是空的),你不应该测试max(Col3)而不是min()?那么,对于a,10集,null不是min(Col3)吗?最大值(col3)是X吗?@Beth。在几乎所有聚合函数中都忽略NULL,例如
MIN
MAX
SUM
,等等。在某些数据库(如Oracle)中,可能会将空字符串转换为空字符串,但这是一种特殊的非ANSI大小写。好的,谢谢。我不是100%肯定。当我按列中的值排序时,空值总是作为第一个值排序。