sql不显示重复列

在报表里,基本上都可以把重复的资料不显示,在SQL里怎么才能做到如下情况呢?

a	10
a	20
b	30
b	40
b	50
显示为:

a	10
	20
b	30
	40
	50

SQL 如下:

create table #a (part varchar(10),price int)
go

insert into #a values('a',10)
insert into #a values('a',20)

insert into #a values('b',30)
insert into #a values('b',40)
insert into #a values('b',50)

go


select * from #a

go
 
select part ,MIN(price) price into #b from #a group by part 
go

select * from #a 
select * from #b
go 
 
 select 
 case when price in (select price from #b) then part else '' end ,price
  from #a 
 go
 
 

参考: http://bbs.youkuaiyun.com/topics/310112824

主要内容:

方案一:

if object_id('[tab]') is not null drop table [tab]
create table [tab]([单位] varchar(6),[姓名] varchar(4),[学历] varchar(4))
insert [tab]
select '一车间','张三','本科' union all
select '一车间','李四','本科' union all
select '一车间','王五','本科' union all
select '二车间','王中','专科' union all
select '二车间','刘一','专科'


select 单位,姓名,学历 from 
(
	select 单位,姓名=(select top 1 姓名 from tab where ta.单位=单位 and ta.学历=学历),学历,s1=0,s2=单位,s3=0 from tab ta group by 单位,学历 union all
	select '   '  ,姓名,'',s1=0,s2=单位,s3=1 from  tab tb where  姓名<>(select top 1 姓名 from tab where tb.单位=单位 and tb.学历=学历)
)t
order by s1,s2,s3

/*
单位     姓名   学历   
------ ---- ---- 
二车间    王中   专科
       刘一   
一车间    张三   本科
       李四   
       王五   

(所影响的行数为 5 行)

*/

方案二:

select 姓名 into #temp from (
select [单位],max(姓名)as 姓名 from [tab]
group by [单位]
)T

select case when 姓名 in (select * from #temp ) then [单位] else '' end,
		姓名,
		case when 姓名 in (select * from #temp ) then [学历] else '' end
from [tab]




<think>好的,我现在需要帮助用户解决如何在SQL中使用DISTINCT去重并显示结果的问题。首先,用户已经提到了DISTINCT,并且引用了三篇相关的博客文章,我需要仔细理解这些引用的内容,再结合用户之前的问题来给出准确的回答。 用户之前的问题是关于如何筛选一个字段等于多个值的SQL语句,我之前的回答详细讲解了IN子句的用法,包括基础语法、子查询动态取值、与OR的对比、大数据量处理方案以及注意事项。现在用户的新问题是关于DISTINCT的使用,需要显示重复的结果。因此,我需要确保回答结构清晰,符合用户要求的格式,并且参考用户提供的引用内容。 首先,我需要回顾用户提供的引用内容: 引用1提到了DISTINCT的基本用法,单独使用和在聚合函数中的使用,并且给出了测试数据和示例。引用2展示了一个具体的SQL查询,其中DISTINCT作用于单,并涉及了多表连接。引用3则指出在使用DISTINCT时,SELECT显示字段只能是DISTINCT指定的字段,否则可能无法正确去重,并提供了临时表的例子。 接下来,我需要整理DISTINCT的使用方法,结合这些引用内容。用户的问题是如何使用DISTINCT去重并显示结果,所以需要涵盖基本语法、单去重、多去重、与聚合函数结合使用、注意事项以及常见误区。 首先,基础语法部分,应该解释DISTINCT关键字的位置和作用,比如放在SELECT之后,名之前。需要强调DISTINCT作用于所有选择的,而仅仅是第一个。例如,引用3中提到,SELECT显示字段只能是DISTINCT指定的字段,这可能是指当使用DISTINCT时,选择的必须一致,否则可能达到预期效果,或者需要明确指定所有需要去重的。 然后,单去重的例子,可以引用引用2中的示例,其中DISTINCT(wg.id)用于去重单。同时需要指出,虽然DISTINCT可以加括号,但并是必须的,例如DISTINCT wg.id也是有效的写法。 多去重的情况需要说明,当多个组合在一起时,DISTINCT会基于所有的组合进行去重。例如,SELECT DISTINCT city, country会返回所有同的城市和国家组合。 接下来,与聚合函数结合使用,如引用1中提到的,在聚合函数中使用DISTINCT,例如COUNT(DISTINCT column_name),这样可以统计同值的数量。需要给出具体的例子,比如统计同城市的数量。 注意事项部分,需要提到DISTINCT对性能的影响,尤其是在处理大数据量时,过多的DISTINCT可能导致查询变慢,这时候可能需要索引优化。此外,NULL值的处理,DISTINCT会将所有NULL视为相同的值,所以如果有多个NULL,只会保留一个。引用3中提到的例子中,使用临时表插入日期数据,然后DISTINCT FKFDate,可能涉及NULL的情况,但具体例子中没有显示NULL,但需要指出这一点。 常见误区方面,需要强调DISTINCT是函数,而是关键字,作用于所有选择的。另外,当DISTINCT与ORDER BY一起使用时,ORDER BY的必须在SELECT表中,否则可能会报错。例如,引用2中的例子中,ORDER BY wg.order,而wg.order并没有在SELECT表中,但用户提供的引用2中的示例确实这样写了,这可能是一个错误,需要指出。过根据引用2的示例,原SQL可能是有效的,因为虽然DISTINCT wg.id,但ORDER BY使用了wg.order,这在同数据库中的处理可能同。例如,在MySQL中,如果ORDER BY的在SELECT中,但属于表的话,可能允许,但这样可能导致结果稳定,因为同的数据库有同的行为,需要提醒用户注意。 此外,引用3中提到使用临时表来测试DISTINCT的效果,可以作为一个例子,说明DISTINCT的作用。例如,插入多个相同的日期,然后使用DISTINCT查询,结果只显示一个。 用户可能的需求是正确使用DISTINCT来去重,并显示所需的,同时避免常见的错误,比如选择了在DISTINCT中的导致去重失败,或者在多去重时没有考虑到所有的组合。 最后,生成相关问题需要考虑用户可能进一步的问题,例如如何优化DISTINCT查询的性能,DISTINCT和GROUP BY的区别,如何处理多去重中的NULL值,以及如何结合聚合函数使用DISTINCT。 需要确保回答符合用户的要求,使用中文,结构清晰,分点说明,并包含代码示例。同时,引用用户提供的引用内容,在适当的地方添加引用标识,如[^1][^2][^3]。</think># SQL中DISTINCT去重查询详解 ## 一、基础语法与作用原理 `DISTINCT`关键字用于消除查询结果中的重复记录,直接作用于`SELECT`子句的集合。其基本语法为: ```sql SELECT DISTINCT 1, 2... FROM 表名 [WHERE 条件]; ``` *示例:查询员工表中重复的部门名称* ```sql SELECT DISTINCT department FROM employees; -- 输出结果仅包含唯一部门名称[^1] ``` ## 二、单去重实践 ### 1. 简单单过滤 ```sql SELECT DISTINCT product_category FROM products; -- 显示所有产品分类且重复[^2] ``` ### 2. 带条件的单去重 ```sql SELECT DISTINCT city FROM customers WHERE country = 'China'; -- 仅显示中国地区重复城市 ``` ## 三、多组合去重 当指定多时,`DISTINCT`会按**组合**进行去重: ```sql SELECT DISTINCT city, province FROM addresses; -- 输出唯一的城市+省份组合 ``` *注:结果中可能出现重复城市(同省份)或重复省份(同城市)* ## 四、与聚合函数联用 ### 1. 统计唯一值数量 ```sql SELECT COUNT(DISTINCT city) FROM customers; -- 统计客户所在的同城市数量[^1] ``` ### 2. 组合聚合计算 ```sql SELECT department, COUNT(DISTINCT job_title) FROM employees GROUP BY department; -- 统计每个部门的唯一职位数量 ``` ## 五、特殊场景处理 ### 1. 含NULL值的去重 ```sql SELECT DISTINCT phone_number FROM contacts; -- 所有NULL会被视为相同值,仅保留一个NULL记录 ``` ### 2. 多表连接去重 ```sql SELECT DISTINCT wg.product_name FROM goods wg JOIN prices gp ON wg.id = gp.goods_id; -- 联表查询时过滤重复商品名[^2] ``` ## 六、性能优化建议 1. **索引支持**:对去重建立索引可加速查询 ```sql CREATE INDEX idx_city ON customers(city); -- 加速城市字段的去重查询 ``` 2. **避免全表扫描**:配合`WHERE`子句缩小数据集范围 3. **替代方案**:大数据量时可改用`GROUP BY`实现相同效果 ```sql SELECT city FROM customers GROUP BY city; -- 与DISTINCT等效 ``` ## 七、常见误区解析 1. **字段选择错误** ```sql -- 错误示例:非去重字段导致结果重复 SELECT DISTINCT department, salary FROM employees; -- 同薪资会导致部门重复出现 ``` 2. **排序冲突** ```sql -- 错误示例:ORDER BY字段在SELECT表 SELECT DISTINCT city FROM addresses ORDER BY province; -- 可能引发语法错误 ``` 3. **错误理解作用范围** ```sql SELECT DISTINCT (city), province FROM locations; -- 括号会改变作用范围,仍按city+province组合去重 ``` --相关问题-- 1. 如何通过`GROUP BY`实现与`DISTINCT`相同的去重效果? 2. `DISTINCT`与`UNIQUE`约束在数据库中的区别是什么? 3. 多去重时如何处理NULL值的组合情况? 4. 大数据量下`DISTINCT`查询的性能优化策略有哪些? [^1]: 引用自优快云博客《SQL_DISTINCT语句详细用法》 [^2]: 参考多表联查去重案例 [^3]: 基于临时表测试的NULL值处理结论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值