Group By&消除不同的价值观

时间:2011-05-26 16:26:34

标签: sql sql-server-2008 group-by

情景1:

表:

id column1 column2
1  "bla"   "foo"
2  "bla"   "bar"

我希望按column1进行分组,并为column2获取null,因为所有行中的值都不相同。

情景2:

表:

id column1 column2
1  "bla"   "foo"
2  "bla"   "foo"

我希望按column1进行分组,并foo获取column2,因为column2的所有值都相等。

是否可以通过sql语句解决这个问题?

2 个答案:

答案 0 :(得分:2)

由于您希望按column1进行分组,因此了解column2是否具有所有相同值的一种方法是检查max(column2) = min(column2)是否正确,因此这应该有效:

select column1, case 
                    when max(column2) = min(column2) then max(column2)
                    else null
                end as col2
  from tabletest
 group by column1;

修改

如果您的column2无法接受null值,那么上述查询就可以了,否则您需要以下一个来处理column2null时的情况:

select t.column1, case 
                      when (select max(1) from tabletest where column2 is null and column1 = t.column1) = 1 then null
                      when max(t.column2) = min(t.column2) then max(t.column2)
                      else null
                  end as col2
  from tabletest t
 group by t.column1;

唯一的区别是我们需要添加case条件来涵盖何时column2 is null

答案 1 :(得分:0)

试试这个:

select id = t.id ,
       col1 = t.col1 ,
       col2 = case when t1.N < 2 then t.col2 end
from myTable t
join ( select col1,N=count(distinct col2)
       from myTable
       group by col1
     ) t1 on t1.col1 = t.col1