我有一个包含大约20列和2000行的表。 例如:
Col1 Col2 Col3 Col4 ... A01 22 AB 11 A01 22 AX 112 A01 23 A5 11 A02 20 AB AA A04 21 AB 11 A04 21 AU 11 A04 29 AB BA A05 21 AB 11 AAA 111 XX 18 AAA 222 GT 1O ...
我需要一个select,它根据以下内容显示满足两列(Col1和Col2)要求的所有行和所有列:
如果Col1是唯一的 - 显示行, 要么 如果Col1不唯一,则仅当Col1和Col2相同时才显示所有行。 从previos表中选择结果后:
Col1 Col2 Col3 Col4 ... A01 22 AB 11 A01 22 AX 112 A02 20 AB AA A04 21 AB 11 A04 21 AU 11 A05 21 AB 11 AAA 111 XX 18 ...
新表(您的解决方案)包含数据: Col1 Col2 Col3 Col4 ......
A01 22 AB 11
A01 22 AX 112
A02 20 AB AA
A04 21 AB 11
A04 21 AU 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
...
答案 0 :(得分: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;
答案 1 :(得分: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