2

我有一个大约 20 列和 2000 行的表。例子:

Col1 Col2 Col3 Col4 ...
A01 22 AB 11
A01 22 斧头 112
A01 23 A5 11
A02 20 AB AA
A04 21 AB 11
A04 21 非盟 11
A04 29 AB 巴
A05 21 AB 11
AAA 111 XX 18
AAA 222 GT 1O
...

我需要一个选择,它根据以下内容显示满足两列(Col1 和 Col2)要求的所有行和所有列:

如果 Col1 是唯一的 - 显示行,或者如果 Col1 不是唯一的,则仅在 Col1 和 Col2 相同时显示所有行。从 previos 表中选择结果后:

Col1 Col2 Col3 Col4 ...
A01 22 AB 11
A01 22 斧头 112
A02 20 AB AA
A04 21 AB 11
A04 21 非盟 11
A05 21 AB 11
AAA 111 XX 18
...

新表(您的解决方案)包含数据: Col1 Col2 Col3 Col4 ...

A01 22 AB 11

A01 22 斧头 112

A02 20 AB AA

A04 21 AB 11

A04 21 非盟 11

A05 21 AB 11

AAA 111 XX 18

...

我不会从中看到的是:

Col1 Col2 Col3 Col4 ...

A01 2 AB 11

A02 1 AB AA

A04 2 AB 11

A05 1 AB 11

AAA 1 XX 18

...

4

2 回答 2

3

在 Oracle 和 MS SQL 中,我会使用分析函数:

select * from
(
    select
        t.* ,
        count(Col1) over (partition by Col1) as count_col1,
        count(Col2) over (partition by Col1, Col2) as count_col2
    from yourTable t
) t
where count_col1 = 1 or count_col2 > 1;

请参阅this fiddle (Oracle)this fiddle (MSSQL)作为证明。

于 2012-08-23T06:25:18.767 回答
2
select * 
from table t1
join (select col1
      from table
      group by col1
      having avg(col2)=max(col2)) t2
     on t1.col1=t2.col1

看到我没有查看您的示例..并且您的请求与示例略有不同,因为我的查询检查 col1 的所有 col2 都应该相同。它不会显示相同的。

在这种情况下,答案将是

select * 
from table1 t1
join (select col1,col2
      from table1
      group by col1,col2
      having count(*)>1
      union
      select col1,cast(null as varchar)
      from table1 group by col1
      having count(*)=1) t2
     on t1.col1=t2.col1 and t1.col2=isnull(t2.col2,t1.col2)

这是更新后的查询,它的小提琴http://sqlfiddle.com/#!3/e944b/2/0

好的..再更新一次:

select * 
from table1 t1
join (select col1,col2
     from table1
     group by col1,col2
     having count(*)>1
     union
     select col1,min(col2)
     from table1 group by col1
     having count(*)=1 or count(*)=count(distinct col2)) t2
     on t1.col1=t2.col1 and t1.col2=t2.col2

和小提琴http://sqlfiddle.com/#!3/d5437/12/0

这应该足以解决第二个问题:

select t3.* 
    from (select distinct col1 from table1)t1
    cross apply (select top 1 * from table1 t2 where t1.col1=t2.col1) t3

和小提琴:http ://sqlfiddle.com/#!3/e944b/4/0

于 2012-08-23T06:32:10.523 回答