如果SQL中为Unique,请选择Column

时间:2014-08-01 07:13:31

标签: sql sql-server

我正在寻找一种只选择列值的方法。

表格中的数据示例:

 Name    City       Age
 -----------------------
 James   New York   20
 Charles New York   21
 Tom     New York   22

select all query的输出示例:

 Name    City       Age
 -----------------------
 James   New York   20
 Charles New York   21
 Tom     New York   22

但如果查尔斯住在伦敦,我希望不打印任何城市或默认值。

表格中的数据示例:

 Name    City       Age
 ------------------------ 
 James   New York   20
 Charles Londen     21
 Tom     New York   22

select all查询的输出示例。

 Name    City       Age
 -----------------------
 James   /          20
 Charles /          21
 Tom     /          22

我希望你能让sql魔术发生......

我尝试使用案例结构但没有任何成功。我正在使用SQL Server。

3 个答案:

答案 0 :(得分:3)

使用联接到其他城市,并屏蔽重复项:

select distinct
    p.name,
    case when p2.city is not null then null else p.city end city,
    p.age
from person p
left join person p2 on p.name = p2.name
   and p.city != p2.city

distinct只为重复的城市生成一行结果。

此查询依赖于城市之间给定名称的年龄一致。如果不是,请使用max(age)之类的内容,并按其他列进行分组。

要为重复项提供默认值而不是null,请将then null更改为then 'Various'(例如)。

答案 1 :(得分:0)

我不认为接受的答案能解决OP的问题,因为它只会检查同名人物在城市中的唯一性。它也不满足提供的第二个数据集。

以下查询在整个列中检查唯一性,并满足OP提供的输入的示例输出。

SELECT
  p.name,
  CASE
    WHEN stats.unique_cities > 1 THEN '/'
    ELSE p.city
  END city,
  p.age
FROM person p
CROSS JOIN (SELECT COUNT(DISTINCT city) unique_cities FROM person) stats;

CROSS JOIN(ANSI-92语法)也可以替换为,语法(ANSI-89语法),即FROM person p, (SELECT ...

答案 2 :(得分:-1)

你可以尝试这个 - 选择名称, 情况何时 (从myt中选择计数(不同的id))> 1 然后7 其他 ID 结束为身份 来自myt 按ID分组,名称

table myt - name,id