请教:SQL语句如何实现同一列里如果与上一行数据相同,则这一行该列数据不显示,但是其他列要照样显示。

想要达到效果:
id count
1 1111
2222
3333
2 4444
5555
3 6666

declare @id int,@count char(20)

  print 'id'+'        '+'count'

  declare C_q cursor for  

  select distinct id from qqq

  open C_q

  fetch next from C_q into @id

  while @@fetch_status=0

  begin

  print cast(@id as varchar(10))+':'  

  declare C_ cursor for

  select[count] from qqq

  where id=@id

  open C_

  fetch next from C_ into @count

  while @@fetch_status=0

  begin

  print '          '+@count

  fetch next from C_ into @count

  end

  close C_

  deallocate C_

  print'======================'  

  fetch next from C_q into @id

  end

  close C_q

  deallocate C_q

其实你要做报表使用游标是一个很好的选择。我采用的就是这个方法给你做的,效果一样。不会你再问。望采纳,谢谢!

追问

谢谢。。。不过还是有点复杂

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-04
你可以吧这个 排序一下。 例如 一下在sqlserver 和oracle 中都可以吧
主要思路就是 生成一个id 这个 id 根据第二列分组。 相同的count 会有多个id 依次1.2.3.。。。 所以最后就判断,如果不是1的话 就让它为空 就行了 。
select case when row<>1 then '' end id, count from (
select row_number() over(partiton by count order by count) row,* from tb
) a追问

恩。谢谢。应该是这样的。

第2个回答  2012-05-04
你这个表没有主键啊?没有主键的表是不知道什么是上一行,什么是下一行的。
如果有主键这个就好写了,没有主键没有办法弄。追问

如果有主键的话,要怎么写呢?

追答

你倒是把主键及数据贴出来呀

追问

uid(主) id count
1 1 111
2 1 222
3 1 222
4 2 444
5 2 555
6 3 666
(自动增长)
这样的

追答

select (case when not exists(select 1 from 你的表 where id = a.id and uid<a.uid) then cast(id as varchar) else '' end),count
from 你的表 a

其实如果你的id+count的值是唯一的,也可以这样写:

select (case when cnt = 1 then cast(id as varchar) else '' end) as id,count
from
(
select id,count,(select count(*) from 你的表 where id = a.id and count<=a.count) as cnt
from 你的表 a
) aa

追问

恩实现了。。谢谢。
如果我在加一张表。让上面的表和表2关联查询可以吗?
表2:
uid(主) id name
1 1 小麦
2 1 大米
3 1 稻子
4 2 五花肉
5 2 大排
6 3 香蕉
想要这样的结果:
id count name
1 111 小麦
222 大米
333 稻子
2 444 五花肉
555 大排
3 666 香蕉

追答

select (case when not exists(select 1 from 你的表1 where id = a.id and uid<a.uid) then cast(id as varchar) else '' end),a.count,b.name
from 你的表1 a
Join 你的表2 b on a.count = b.count --是这两个字段关联吗?

本回答被提问者采纳
第3个回答  2012-05-04
用distinct就行了,这个就是对相同的过滤,
SELECT DISTINCT 列名称 FROM 表名称
SELECT DISTINCT ID,COUNT FROM 表追问

不行啊。这个distinct只是根据某一字段去除相同的内容,该重复行后面不重复的内容就不显示了。

第4个回答  2012-05-04
这个不好搞
sql肯定不是你最终展示给客户看的撒
所以我建议你在程序里展示的时候去做这个处理
比如在页面 循环展示的时候 存储一个变量 当发现本次的值和上次存下来的值不一样 才展示 否则不展示追问

我这个要做报表。。。所以没有页面。

追答

我不信这个是直接展示给客户看的 不管是页面还是导出excel 都在程序处理

请教:SQL语句如何实现同一列里如果与上一行数据相同,则这一行该列数据...
deallocate C_q 其实你要做报表使用游标是一个很好的选择。我采用的就是这个方法给你做的,效果一样。不会你再问。望采纳,谢谢!

用sql语句实现在同一张表中找到1个字段相同,另1个字段不同的记录
oracle数据库中后者可以用wmsys.wm_concat实现,具体sql如下:select 字段1, wmsys.wm_concat(字段2) from 表group by 字段1 追问 #1305 - FUNCTION wmsys.wm_concat does not exist 出现这个错误 追答 厄,目测你这是SQL SERVER如果有其它列做标识,可以用在子查询中使用union来连接如果没有标识,只好用存储过程...

用sql语句实现在同一张表中找到1个字段相同,另1个字段不同的记录
select distinct x.字段一,x.字段二 from a as x,a as Y where x.字段一=y.字段一 and x.字段二!=y.字段二 其中,x和y是a表的别称,这个原来是用来查询至少选修两门课程的学生,我改成了这样,也就意味着查询结果可能有多个,因为万一有三个,他们之间就是两两不相同的,也符合这个条件 ...

SQL 语句 查询指定字段相同的只显示一条单据
可以通过分组来实现去除重复行,distinct是对查询结果后的去重,效率很低,不建议使用,你想要根据某个字段去除重复行,就必须明白对其他行进行什么样的聚合,比如说学生成绩表,你想查看每个班级的平均分数,那么就应该对学生的成绩做sum()聚合,然后根据班级来分组,现在你想对orderno做分组,就要考虑清...

sql重复数据只取一条记录
1、SQL SELECT DISTINCT 语句 在表中,可能会包含重复值。这并不成问题,不过,仅仅列出不同(distinct)的值。关键词 DISTINCT 用于返回唯一不同的值。语法:SELECT DISTINCT 列名称 FROM 表名称 使用 DISTINCT 关键词 SELECT DISTINCT Company FROM Orders 2、子查询限制返回结果 SELECT * FROM Test...

sql查询语句,怎样查询重复数据
sql SELECT 列名, COUNT FROM 表名 GROUP BY 列名 HAVING COUNT > 1;在上面的查询中,我们选择了可能含有重复数据的列进行分组,并使用COUNT函数来计算每个组的记录数。然后,HAVING子句帮助我们过滤出那些记录数大于1的组,即找到了重复的数据。通过这种方式,我们可以轻松地使用SQL查询语句来查找数据库...

SQL查找某一字段相同,某一字段不同的数据
1、在我们的电脑上打开数据库,这里新建一张含有重复数据的user表做示例。2、我们输入“select * from user where name in (select name from user group by name having count(name) > 1) ”sql语句,点击运行可以看到查询出了数据库中user表的重复数据。3、通过“delete from user where name...

如何用SQL语句实现相同列值只取一行?
select top 1 * from 表 where 公司 in (select distinct 公司 from 表)

用SQL语句怎么把同一个表中一行的内容全部替换为另一行除了保留ID
update table_name set (name,umber,xxx,...) = (select name,umber,xxx,... from (select name,umber,xxx,..., rownum rn from table_name) where rn=62) where id in (select id from (select id, rownum rn from table_name) where rn > 62 and rn<71);...

SQL 查询语句中如果某个字段有相同值时只显示一行
select from (select *,row_number() over(parititon by id,name order by age desc) rn from table_name ) t where rn<=1 --desc不加就是选年纪小的那行

相似回答