100分求助,请问这个Select怎么写,上面那个写的不清楚,再发一个

zhouboail 2010-07-20 03:39:05
有一个表,表中有如下数据:
id 姓名 语文 数学 英语
1 张三 97 93 null
2 张三 93 92 null
3 张三 null null 80
4 张三 null null 97

我想查询出来的结果是这样的:
姓名 语文 数学 英语
张三 97 93 80
张三 93 92 97

这样的select语句怎么写,我想和很多方法,老是是有四条数据
希望有大侠指点指点

...全文
225 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingkingzhu 2010-07-23
  • 打赏
  • 举报
回复
瞎搞 业务逻辑不清楚
数据也就给个4条,没介绍清楚
lzf616 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 cosio 的回复:]
引用 31 楼 lzf616 的回复:
SQL code

with t as
(
select 1 id,'张三' a,97 b,93 c,null d from dual
union all
select 2,'张三',93,92,null from dual
union all
select 3,'张三',null,null,80 from dual
union all
……
[/Quote]

楼主本身要的数据就是没有意义的,我只是按其四条数据给他写东西而已。我也知道数据多会不合适的。
cosio 2010-07-21
  • 打赏
  • 举报
回复
根据楼上,测试其他数据,PASS

with a as(
select 1 id,'张三' a,97 b, 93 c, 0 d from dual
union all
select 2,'张三',93,92,0 from dual
union all
select 3,'张三',93,92,0 from dual
union all
select 4,'李四',89,98,0 from dual
union all
select 5,'李四',0,0,81 from dual
union all
select 6,'张三',0,0,80 from dual
union all
select 7,'张三',0,0,97 from dual
union all
select 8,'张三',0,0,98 from dual
union all
select 9,'王五',87,97,0 from dual
union all
select 10,'王五',0,0,100 from dual
)
select distinct a.id,a.a 姓名,a.b 语文,a.c 数学,b.d 英语
from
(
select id,a,b,c,d,row_number() over(partition by a.a,a.d order by a.id) rm from a
where d=0
)a,
(
select id,a,b,c,d,row_number() over(partition by a.a,a.b,a.c order by a.id) rn from a
where d<>0
)b
where a.a=b.a and a.rm=b.rn
order by a.id

--result:
1 张三 97 93 80
2 张三 93 92 97
3 张三 93 92 98
4 李四 89 98 81
9 王五 87 97 100

cosio 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 lzf616 的回复:]
SQL code

with t as
(
select 1 id,'张三' a,97 b,93 c,null d from dual
union all
select 2,'张三',93,92,null from dual
union all
select 3,'张三',null,null,80 from dual
union all
select 4,'张三',null,n……
[/Quote]


你没有试用一下其他的数据来测试!!!

with a as(
select 1 id,'张三' a,97 b, 93 c, 0 d from dual
union all
select 2,'张三',93,92,0 from dual
union all
select 3,'张三',89,98,0 from dual
union all
select 4,'张三',0,0,81 from dual
union all
select 5,'张三',0,0,80 from dual
union all
select 6,'张三',0,0,97 from dual
)
select a as 姓名,sum(b) as 语文,sum(c) as 数学 ,sum(d) as 英语 from a group by mod(id,2),a


--RESULT:

张三 93 92 178
张三 186 191 80

结果就错了!!
lzf616 2010-07-21
  • 打赏
  • 举报
回复

with t as
(
select 1 id,'张三' a,97 b,93 c,null d from dual
union all
select 2,'张三',93,92,null from dual
union all
select 3,'张三',null,null,80 from dual
union all
select 4,'张三',null,null,97 from dual
)

select a as 姓名,sum(b) as 语文,sum(c) as 数学 ,sum(d) as 英语 from t group by mod(id,2),a

cosio 2010-07-21
  • 打赏
  • 举报
回复
with a as(
select 1 id,'张三' a,97 b, 93 c, 0 d from dual
union all
select 2,'张三',93,92,0 from dual
union all
select 3,'李四',89,98,0 from dual
union all
select 4,'李四',0,0,81 from dual
union all
select 5,'张三',0,0,80 from dual
union all
select 6,'张三',0,0,97 from dual
)
select distinct a.id,a.a 姓名,a.b 语文,a.c 数学,b.d 英语
from
(
select id,a,b,c,d,row_number() over(partition by a.a,a.d order by a.id) rm from a
where d=0
)a,
(
select id,a,b,c,d,row_number() over(partition by a.a,a.b,a.c order by a.id) rn from a
where d<>0
)b
where a.a=b.a and a.rm=b.rn
order by a.id

--RESULT:
1 张三 97 93 80
2 张三 93 92 97
3 李四 89 98 81
xman_78tom 2010-07-20
  • 打赏
  • 举报
回复

with t as(
select 1 id,'张三' name,97 chinese, 93 math, null english from dual
union all
select 2,'张三',93,92,null from dual
union all
select 3,'李四',89,98,null from dual
union all
select 4,'李四',null,null,81 from dual
union all
select 5,'张三',null,null,80 from dual
union all
select 6,'张三',null,null,97 from dual
),
t1 as(
select name,chinese,row_number() over (order by name,id) rn
from t where chinese is not null order by name,id
),
t2 as(
select name,math,row_number() over (order by name,id) rn
from t where math is not null order by name,id
),
t3 as(
select name,english,row_number() over (order by name,id) rn
from t where english is not null order by name,id
)
select t1.name,t1.chinese,t2.math,t3.english
from t1,t2,t3 where t1.name=t2.name and t2.name=t3.name and t1.rn=t2.rn and t2.rn=t3.rn;
/*
张三 97 93 80
张三 93 92 97
李四 89 98 81
*/
  • 打赏
  • 举报
回复
你用的是什么数据库啊
iqlife 2010-07-20
  • 打赏
  • 举报
回复
这种数据整理出来也没有什么意义吧
董小尾 2010-07-20
  • 打赏
  • 举报
回复
这个就变成了报表中的交叉表了 有点难度
cosio 2010-07-20
  • 打赏
  • 举报
回复
with a as
(
select 1 id,'张三' a,97 b,93 c,0 d from dual
union all
select 2,'张三',93,92,0, from dual
union all
select 3,'张三',0,0,80 from dual
union all
select 4,'张三',0,0,97 from dual
)

select distinct b.id,b.a 姓名,b.b 语文,b.c 数学,a.b 英语
from
(
select id,a,b,c,row_number() over(partition by a.a,a.d order by a.id) rm from a
)a,
(
select id,a,b,c,row_number() over(partition by a.a,a.b,a.c order by a.id) rn from a
)b
where a.a=b.a and a.rm=b.rn
order by b.id
zhizhuo89 2010-07-20
  • 打赏
  • 举报
回复
Select name,Sum(yuwen),Sum(shuxue),Sum(yingyu) From (
with test as
(
select 1 id,'张三' Name,97 yuwen,93 shuxue,Null yingyu from dual
union all
select 2,'张三',93,92,Null from dual
union all
select 3,'张三',Null,Null,80 from dual
union all
select 4,'张三',Null,Null,97 from dual
)
Select Name,
nvl(yuwen,0) yuwen,
nvl(shuxue,0) shuxue,
nvl(yingyu,0) yingyu,
Rownum num
From test Where yuwen Is Null And shuxue Is Null And yingyu Is Not Null
Union
Select Name,
nvl(yuwen,0) yuwen,
nvl(shuxue,0) shuxue,
nvl(yingyu,0) yingyu,
Rownum num
From test Where yuwen Is Not Null And shuxue Is Not Null And yingyu Is Null
) temp1 Group By Name,num;
cosio 2010-07-20
  • 打赏
  • 举报
回复
那数据是不是对称的呢,如,张三,有语文和数学成绩三个,那就对应会有三条英语记录?
如果是四条就会有四条呢?
baobeizhu100 2010-07-20
  • 打赏
  • 举报
回复


你这个没有任何规则,没办法写SQL啊
masuz1 2010-07-20
  • 打赏
  • 举报
回复
像楼上说的,数据没有确定的关联规则,一条语句应该出不来,就用循环一条条记录处理吧。
先按姓名对整个表排序,然后从前往后检查,只要当前一条记录的成绩有NULL值,就从后面的记录中找,找到后替换当前的NULL值,并把取值记录中的值改为NULL。
循环完成后,select出那些不是全NULL的记录就可以了。
虽然慢点,但是应该能够处理这种数据。
minitoy 2010-07-20
  • 打赏
  • 举报
回复
呵呵,这种垃圾数据就算了,重新输入吧。
你都没一个确定的规则去关联
zhouboail 2010-07-20
  • 打赏
  • 举报
回复
另外,张三或李四的数据都有可能有多条
但一个人语文,数学的记录数和英语的记录数是一样的
zhouboail 2010-07-20
  • 打赏
  • 举报
回复
张三的数据会有三个张三的数据,四个张三的数据
这个只是我写的一个例子,真实情况的表比较复杂,为了方便,所以我简化了一下
cosio 2010-07-20
  • 打赏
  • 举报
回复
1 张三 97 93 null
2 张三 93 92 null
3 李四 89 98 null
4 李四 null null 81
5 张三 null null 80
6 张三 null null 97


像这种数据,张三会不会还有,如有三个张三的数据,四个张三的数据........
mg_chen 2010-07-20
  • 打赏
  • 举报
回复
有两条张三的英语,就必须要先对数据预先处理一下,将两条进行区分。

id 姓名 语文 数学 英语 序号
1 张三 97 93 null 1
2 张三 93 92 null 2
3 李四 89 98 null 1
4 李四 null null 81 2
5 张三 null null 80 1
6 张三 null null 97 2

分组条件由姓名变成按姓名+序号。
加载更多回复(15)

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧