我的数据结构
id    name1    name2  content1   content2   1    2
1      张三      李四     什么       什么      10      9
2      王五      李四     什么       地方      10      9
3      李四      张三     什么       什么      10      9
我要查询出每个人出现的次数,以及每个人的总分数
1对应的是name1的分数,2对应的是name2的分数
这个应该怎么查啊?

解决方案 »

  1.   

    SELECT NAME, SUM(cnt) cnt, SUM() 
      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;
      

  2.   

    这样可以不?with tab as
    (
    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
      

  3.   


    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> 
      

  4.   

    SQL> select * from test;        ID NAME1            NAME2            CONTENT1         CONTENT2
    ---------- ---------------- ---------------- ---------------- ----------------
         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>
      

  5.   

    修改下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 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> 
      

  6.   

    SELECT name,sum(num) num,sum()  FROM
    (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;
      

  7.   

    select name1,count(*),sum(1)
    from (
    select name1,1 from table1
    union all
    select name2,2 from table1
    ) t
    group by name1
      

  8.   

    with tab as
        (
        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不知这样是否符合你的要求
      

  9.   

    我的要求没说清楚,还要把内容content的和到一起显示出来,
    就是这样的结果
    NAME              出现次数      总分       内容
    ---------------- ---------- ---------- ---------
    王五                      1        10      什么,什么
    李四                      3        28      什么,地方,什么
    张三                      2        19      什么
      

  10.   

    select name,count(*) 出现次数,sum(1) 总分,wm_concat(c) 内容
    from (
    select name1 name,1 m,content1 c from test
    union all 
    select name2 name,2 m,content2 c from test
    )
    group by name;
      

  11.   

    丢三落四………select name,count(*) 出现次数,sum(m) 总分,wm_concat(c) 内容 
    from ( 
    select name1 name,1 m,content1 c from test 
    union all 
    select name2 name,2 m,content2 c from test 

    group by name;
      

  12.   

    suiziguo,请教你下,应该怎么设计才合理啊,我自己也觉得很别扭啊
      

  13.   

    还有哦,再请教你个问题
    我的数据里的name,有这样的张三(学),这里输入法的不同,括号也不一样啊,我想写个function只把前面的名字取出来,后面的不要,好做统计,这个funciton应该怎么写了?
      

  14.   

    关键是MARK不同,增加一个类似_type的字段,name1,name2合并,content1,content2及1,2分别合并。如果是2人配合项目得的分数,则可分主从表,怎么着,都比现设计合理。
    无知妄言,仅供参考。
      

  15.   

    ((的问题,有点麻烦,比如有没有中括号[],大括号{},如果只确定有小括号,全/半角,则提取全/半括号,则分别提取之,用substr+instr函数提取括号前的部分。
      

  16.   

    按常理来说,姓名等应该是有编号的,人员基本信息等都应该是一张基础字典表
    其它如成绩等,应该分拆成另一张表,
    楼主的表设计不符合关系数据库的1NF-3NF范氏理论
    详细参照:http://bbs.tech.ccidnet.com/read.php?tid=582656
      

  17.   

    substr(colname,1,instr(colname,1,'(')-1)也没环境,毛估估,将就着测测,若误,调整下,大致意思如此。
    但是,效率委实不敢恭维,特别是数据量大时。