我的数据结构
id name1 name2 content1 content2 1 2
1 张三 李四 什么 什么 10 9
2 王五 李四 什么 地方 10 9
3 李四 张三 什么 什么 10 9
我要查询出每个人出现的次数,以及每个人的总分数
1对应的是name1的分数,2对应的是name2的分数
这个应该怎么查啊?
id name1 name2 content1 content2 1 2
1 张三 李四 什么 什么 10 9
2 王五 李四 什么 地方 10 9
3 李四 张三 什么 什么 10 9
我要查询出每个人出现的次数,以及每个人的总分数
1对应的是name1的分数,2对应的是name2的分数
这个应该怎么查啊?
FROM (SELECT name1 NAME, COUNT(*) cnt, SUM(1)
FROM test
GROUP BY name1
UNION ALL
SELECT name2 NAME, COUNT(*) cnt, SUM(2) FROM test GROUP BY name2)
GROUP BY NAME;
(
select 1 id , '张三' name1,'李四' name2, '什么' content1, '什么' content2, 10 1, 9 2 from dual
union all
select 2 id , '王五' name1,'李四' name2, ' 什么' content1, '地方' content2, 10 1, 9 2 from dual
union all
select 3 id , '李四' name1,'张三' name2, ' 什么' content1, '什么' content2, 1 1, 9 2 from dual
)
select name,content,,count(*)over(partition by name order by 1) cnt,sum()over(partition by name order by 1) total
from (
select id,name1 name ,content1 content,1 from tab
union all
select id,name2 name,content2 content,2 from tab ) tabt
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as billing
SQL>
SQL> with tab as
2 (
3 select 1 id , '张三' name1,'李四' name2, '什么' content1, '什么' content2, 10 1, 9 2 from dual
4 union all
5 select 2 id , '王五' name1,'李四' name2, ' 什么' content1, '地方' content2, 10 1, 9 2 from dual
6 union all
7 select 3 id , '李四' name1,'张三' name2, ' 什么' content1, '什么' content2, 1 1, 9 2 from dual
8 )
9 select name,content,,count(*)over(partition by name order by 1) cnt,sum()over(partition by name order by 1) total
10 from (
11 select id,name1 name ,content1 content,1 from tab
12 union all
13 select id,name2 name,content2 content,2 from tab ) tabt
14 /NAME CONTENT MARK CNT TOTAL
---- ------- ---------- ---------- ----------
李四 什么 1 3 19
李四 地方 9 3 19
李四 什么 9 3 19
王五 什么 10 1 10
张三 什么 9 2 19
张三 什么 10 2 196 rows selectedSQL>
---------- ---------------- ---------------- ---------------- ----------------
MARK1 MARK2
---------- ----------
2 王五 李四 什么 地方
10 9 1 张三 李四 什么 什么
10 9 3 李四 张三 什么 什么
10 9
SQL> select name,sum(c) 出现次数,sum(m) 总分 FROM
2 (select name1 name,count(*) c,sum(1) m from test
3 group by name1
4 union all
5 select name2 name,count(*) c,sum(2) m from test
6 group by name2)
7 group by name;NAME 出现次数 总分
---------------- ---------- ----------
王五 1 10
李四 3 28
张三 2 19SQL>
2 (
3 select 1 id , '张三' name1,'李四' name2, '什么' content1, '什么' content2, 10 1, 9 2 from dual
4 union all
5 select 2 id , '王五' name1,'李四' name2, ' 什么' content1, '地方' content2, 10 1, 9 2 from dual
6 union all
7 select 3 id , '李四' name1,'张三' name2, ' 什么' content1, '什么' content2, 1 1, 9 2 from dual
8 )
9 select distinct name,
10 count(*) over(partition by name order by 1) cnt,
11 sum() over(partition by name order by 1) total
12 from (select id, name1 name, content1 content, 1
13 from tab
14 union all
15 select id, name2 name, content2 content, 2 from tab) tabt
16 /NAME CNT TOTAL
---- ---------- ----------
王五 1 10
张三 2 19
李四 3 19SQL>
(SELECT name1 name,count(1) num,sum(1) FROM test GROUP BY name1
UNION ALL
SELECT name2 name,count(1) num,sum(2) FROM test GROUP BY name2)
GROUP BY name;
from (
select name1,1 from table1
union all
select name2,2 from table1
) t
group by name1
(
select 1 id , '张三' name1,'李四' name2, '什么' content1, '什么' content2, 10 1, 9 2 from dual
union all
select 2 id , '王五' name1,'李四' name2, ' 什么' content1, '地方' content2, 10 1, 9 2 from dual
union all
select 3 id , '李四' name1,'张三' name2, ' 什么' content1, '什么' content2, 1 1, 9 2 from dual
)
select name,content,,count(*)over(partition by name order by 1) cnt,sum()over(partition by name order by 1) total
from (
select id,name1 name ,content1 content,1 from tab
union all
select id,name2 name,content2 content,2 from tab ) tabt
/NAME CONTENT MARK CNT TOTAL
---- ------- ---------- ---------- ----------
李四 什么 1 3 19
李四 地方 9 3 19
李四 什么 9 3 19
王五 什么 10 1 10
张三 什么 9 2 19
张三 什么 10 2 19不知这样是否符合你的要求
就是这样的结果
NAME 出现次数 总分 内容
---------------- ---------- ---------- ---------
王五 1 10 什么,什么
李四 3 28 什么,地方,什么
张三 2 19 什么
from (
select name1 name,1 m,content1 c from test
union all
select name2 name,2 m,content2 c from test
)
group by name;
from (
select name1 name,1 m,content1 c from test
union all
select name2 name,2 m,content2 c from test
)
group by name;
我的数据里的name,有这样的张三(学),这里输入法的不同,括号也不一样啊,我想写个function只把前面的名字取出来,后面的不要,好做统计,这个funciton应该怎么写了?
无知妄言,仅供参考。
其它如成绩等,应该分拆成另一张表,
楼主的表设计不符合关系数据库的1NF-3NF范氏理论
详细参照:http://bbs.tech.ccidnet.com/read.php?tid=582656
但是,效率委实不敢恭维,特别是数据量大时。