2011-10-29 77 views
0

我有这个表:T-SQL查询来寻找共同的特点

ID Value 
------------ 
1  car 
1  moto 
2  car 
2  moto 
3  moto 
3  apple 
4  gel 
4  moto 
5  NULL 

注意moto是共同的所有ID。

我会获得一个单行这个结果

car*, moto, apple*, gel* 

  • car, apple, gel有星号,因为是存在的,但并不是在所有的ID
  • moto没有星号,因为是常有的事到所有ID

回答

2

如果ID + Value是唯一的

SELECT Value, CASE WHEN COUNT(*) <> (SELECT COUNT(DISTINCT ID) FROM MyTable) THEN '*' ELSE '' END AS Asterisk FROM MyTable WHERE Value IS NOT NULL GROUP BY Value 

请注意,这不会在一行中分组。并注意你的问题是错误的。 ID5是一个ID,所以moto不是所有的ID s。所有的ID至少有一个值是很常见的。

如果我们书面过滤这些ID S,

SELECT Value, CASE WHEN COUNT(*) <> (SELECT COUNT(DISTINCT ID) FROM MyTable WHERE Value IS NOT NULL) THEN '*' ELSE '' END FROM MyTable WHERE Value IS NOT NULL GROUP BY Value 

“合并” 的*Value,只需用一个+更换,,如:

SELECT Value + CASE WHEN COUNT(*) <> (SELECT COUNT(DISTINCT ID) FROM MyTable WHERE Value IS NOT NULL) THEN '*' ELSE '' END Value FROM MyTable WHERE Value IS NOT NULL GROUP BY Value 

为了使单行使用https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/之一我会补充说,可悲的是,tsql没有任何本地方法来做到这一点,所有的替代品都有点难看:-)

一般来说,串集约部是很常见的SO(和它的外面)Concatenate row values T-SQLtsql aggregate string for group byImplode type function in SQL Server 2000?How to return multiple values in one column (T-SQL)?和太多的人来算:-)

+0

为什么选择Oracle? OP指定TSQL。 –

+1

@MartinSmith因为我给了他错误的链接:-)我收集了一些关于STRING_AGG替代品的链接,我给了他一个错误的链接 – xanatos