表结构数据如下文章id   栏目id   所属机构id
1         a          01
2         a          01_1
3         b          01_1_2
4         c          01
5         a          09 
6         a          09_1 
7         b          010_1  
8         c          010
9         c          09_1_1
10        a          010_1_1
11        a          010_1 
12        a          01
13        b          01_2其中机构id   01_  09_  010_ 都为相应01、09、010机构子机构请问如何得到以下统计结果
获得各个机构(包括子机构)在各个栏目下发布的文章总数栏目    机构01   机构09 机构010
a        3           2       2
b        2           0       1
c        1           1       1

解决方案 »

  1.   

    SELECT 栏目ID,
           COUNT(DECODE(SUBSTR(所属机构ID, 1, 3), '01_', 文章ID)) 机构01,
           COUNT(DECODE(SUBSTR(所属机构ID, 1, 3), '09_', 文章ID)) 机构09,
           COUNT(DECODE(SUBSTR(所属机构ID, 1, 3), '010', 文章ID)) 机构010
      FROM TBL
      

  2.   

    这不还是上次那个么?with t as(
    select '1' wen_id,'a' lan_id, '01' zuo_id from dual
    union all
    select '2' wen_id,'a' lan_id, '01_1' zuo_id from dual
    union all
    select '3' wen_id,'b' lan_id, '01_1_2' zuo_id from dual
    union all
    select '4' wen_id,'c' lan_id, '01' zuo_id from dual
    union all
    select '5' wen_id,'a' lan_id, '09' zuo_id from dual
    union all
    select '6' wen_id,'a' lan_id, '09_1' zuo_id from dual
    union all
    select '7' wen_id,'b' lan_id, '010_1' zuo_id from dual
    union all
    select '8' wen_id,'c' lan_id, '010' zuo_id from dual
    union all
    select '9' wen_id,'c' lan_id, '09_1_1' zuo_id from dual
    union all
    select '10' wen_id,'a' lan_id, '010_1_1' zuo_id from dual
    union all
    select '11' wen_id,'a' lan_id, '010_1' zuo_id from dual
    union all
    select '12' wen_id,'a' lan_id, '01' zuo_id from dual
    union all
    select '13' wen_id,'b' lan_id, '01_2' zuo_id from dual)
    select tt.lan_id,
           MAX(nvl(decode(tt.org_id, '01', nm), 0)) 机构01,
           MAX(nvl(decode(tt.org_id, '09', nm), 0)) 机构09,
           MAX(nvl(decode(tt.org_id, '010', nm), 0)) 机构010
      from (
            
            select s.org_id, s.lan_id, count(s.wen_id) nm
              from (select t.wen_id,
                            t.lan_id,
                            substr(t.zuo_id,
                                   1,
                                   decode(instr(t.zuo_id, '_', 1),
                                          0,
                                          length(t.zuo_id) + 1,
                                          instr(t.zuo_id, '_') - 1)) org_id
                       from t) s
             group by s.lan_id, s.org_id
             order by s.org_id, s.lan_id) tt
     group by tt.lan_id
     order by tt.lan_id
      

  3.   

    这和上次那个差不多啊with t as(
    select '1' wen_id,'a' lan_id, '01' zuo_id from dual
    union all
    select '2' wen_id,'a' lan_id, '01_1' zuo_id from dual
    union all
    select '3' wen_id,'b' lan_id, '01_1_2' zuo_id from dual
    union all
    select '4' wen_id,'c' lan_id, '01' zuo_id from dual
    union all
    select '5' wen_id,'a' lan_id, '09' zuo_id from dual
    union all
    select '6' wen_id,'a' lan_id, '09_1' zuo_id from dual
    union all
    select '7' wen_id,'b' lan_id, '010_1' zuo_id from dual
    union all
    select '8' wen_id,'c' lan_id, '010' zuo_id from dual
    union all
    select '9' wen_id,'c' lan_id, '09_1_1' zuo_id from dual
    union all
    select '10' wen_id,'a' lan_id, '010_1_1' zuo_id from dual
    union all
    select '11' wen_id,'a' lan_id, '010_1' zuo_id from dual
    union all
    select '12' wen_id,'a' lan_id, '01' zuo_id from dual
    union all
    select '13' wen_id,'b' lan_id, '01_2' zuo_id from dual)
    select tt.lan_id,
           MAX(nvl(decode(tt.org_id, '01', nm), 0)) 机构01,
           MAX(nvl(decode(tt.org_id, '09', nm), 0)) 机构09,
           MAX(nvl(decode(tt.org_id, '010', nm), 0)) 机构010
      from (
            
            select s.org_id, s.lan_id, count(s.wen_id) nm
              from (select t.wen_id,
                            t.lan_id,
                            substr(t.zuo_id,
                                   1,
                                   decode(instr(t.zuo_id, '_', 1),
                                          0,
                                          length(t.zuo_id) + 1,
                                          instr(t.zuo_id, '_') - 1)) org_id
                       from t) s
             group by s.lan_id, s.org_id
             order by s.org_id, s.lan_id) tt
     group by tt.lan_id
     order by tt.lan_id
      

  4.   

    已经测试通过:
    表结构:
    SQL> desc define
     名称                                      是否为空? 类型
     ----------------------------------------- -------- -------------------- ID                                                 NUMBER(10)
     TASKID                                             VARCHAR2(10)
     INFO                                               VARCHAR2(20)
    在插入你上述数据执行如下sql得到对应结果:select taskID,
    sum(case when substr(info,1,2)='01' and  substr(info,1,3)!='010' then 1 else 0 end),
    sum(case when substr(info,1,2)='09' then 1 else 0 end),
    sum(case when substr(info,1,3)='010' then 1 else 0 end)
    from define group by taskid
    /
      

  5.   

    借一下数据with t as
     (select '1' wen_id, 'a' lan_id, '01' zuo_id
        from dual
      union all
      select '2' wen_id, 'a' lan_id, '01_1' zuo_id
        from dual
      union all
      select '3' wen_id, 'b' lan_id, '01_1_2' zuo_id
        from dual
      union all
      select '4' wen_id, 'c' lan_id, '01' zuo_id
        from dual
      union all
      select '5' wen_id, 'a' lan_id, '09' zuo_id
        from dual
      union all
      select '6' wen_id, 'a' lan_id, '09_1' zuo_id
        from dual
      union all
      select '7' wen_id, 'b' lan_id, '010_1' zuo_id
        from dual
      union all
      select '8' wen_id, 'c' lan_id, '010' zuo_id
        from dual
      union all
      select '9' wen_id, 'c' lan_id, '09_1_1' zuo_id
        from dual
      union all
      select '10' wen_id, 'a' lan_id, '010_1_1' zuo_id
        from dual
      union all
      select '11' wen_id, 'a' lan_id, '010_1' zuo_id
        from dual
      union all
      select '12' wen_id, 'a' lan_id, '01' zuo_id
        from dual
      union all
      select '13' wen_id, 'b' lan_id, '01_2' zuo_id from dual
      
      )SELECT *
      FROM (SELECT lan_id, replace(substr(zuo_id, 1, 3), '_', '') as ss FROM t) 
      PIVOT(count(1) FOR ss IN('01' x01,'09' x09,'010' x010)) s
    /L        X01        X09       X010
    - ---------- ---------- ----------
    a          3          2          2
    b          2          0          1
    c          1          1          1
      

  6.   

    杨老板的帖子
    http://yangtingkun.itpub.net/post/468/392770
    看看你就会了
      

  7.   

    6楼的就可以了,1楼的最后再加个group by 栏目id 语句就好了。
      

  8.   

    CREATE TABLE wenzhang(
    wenzhangid  VARCHAR2(4),      --文章ID
    lanmu  VARCHAR2(10),          --栏目ID
    jigou  VARCHAR2(10)           --所属机构ID
    );SELECT P.LANMU AS "栏目",NVL(SUM("01"),0) AS "机构01",NVL(SUM("09"),0) AS "机构09",NVL(SUM("010"),0) AS "机构010"
    FROM
    (SELECT O.LANMU,
    CASE WHEN O.JIGOU = '01'  THEN '1' END "01",
    CASE WHEN O.JIGOU = '09'  THEN '1' END "09",
    CASE WHEN O.JIGOU = '010' THEN '1' END "010"
    FROM 
    (SELECT T.LANMU AS LANMU, 
    CASE 
    WHEN INSTR(T.JIGOU,'_')  = 0 THEN SUBSTR(T.JIGOU,0,2)
    WHEN  INSTR(T.JIGOU,'_') = 3 THEN SUBSTR(T.JIGOU,0,2)
    WHEN INSTR(T.JIGOU,'_')  = 4 THEN SUBSTR(T.JIGOU,0,3)   
    END AS JIGOU
    FROM WENZHANG T) O)P
    GROUP BY P.LANMU
      

  9.   


    SELECT O.LANMU,NVL(SUM("01"),0),NVL(SUM("09"),0),NVL(SUM("010"),0)
    FROM
    (SELECT T.LANMU,
    CASE WHEN SUBSTR(T.JIGOU,0,2) = '01' AND INSTR(T.JIGOU,'_')<4 THEN 1 END "01",
    CASE WHEN SUBSTR(T.JIGOU,0,2) = '09' THEN 1 END "09",
    CASE WHEN SUBSTR(T.JIGOU,0,3) ='010' THEN 1 END "010"
     FROM WENZHANG T
     ) O
     GROUP BY O.LANMU
     ;
      

  10.   


    SELECT T.LANMU,
    NVL(SUM(CASE WHEN SUBSTR(T.JIGOU,0,2) = '01' AND INSTR(T.JIGOU,'_')<4 THEN 1 END),0) "01",
    NVL(SUM(CASE WHEN SUBSTR(T.JIGOU,0,2) = '09' THEN 1 END),0) "09",
    NVL(SUM(CASE WHEN SUBSTR(T.JIGOU,0,3) ='010' THEN 1 END ),0) "010"
     FROM WENZHANG T
    GROUP BY T.LANMU;
      

  11.   

    SELECT * FROM TALBE where id in (repalce(所属机构id,'-',','))这个简单点
      

  12.   

    SELECT * FROM TALBE where id in (repalce(所属机构id,'-',','))//所属id 应该是一个变量,或者从程序当中取到的,这么说不知道了不了?