有三个表
a :riskcode,riskname 险种代码,险种名称
b : managecom,prem,riskcode  机构代码,保费,险种代码
c : comcode,name 机构代码,机构名称
其中机构代码为8位(机构分为总公司,分公司,子公司)
分公司代码占前面4位
如: XX分公司代码为86010000
    其子公司为86010001,86010002等
我现在想统计各个险种中各个分公司的保费总额
分公司保费总额 = 分公司保费 + 其所有子公司的保费
我写如下SQL 语句但是结果有很多重复数据SELECT 
 a.riskcode 险种代码,
 a.riskname 险种名称,
 substr(b.managecom,1,4) 机构代码,
 c.name 机构名称
 SUM(b.prem) over(partition by a.riskcode, substr(b.managecom,1,4)) 保费
 FROM a a, b b, c c
 WHERE a.riskcode = b.riskcode
 AND b.managecom = c.comcode 正确的写法应该怎样?
麻烦大家帮忙一下,谢谢!

解决方案 »

  1.   

    SELECT A.riskcode,A.riskname,c.comcode,c.NAME,
      sum(b.prem)
    FROM A,b,c
    WHERE c.comcode LIKE '%0000'
      AND b.managecom LIKE substr(c.comcode,1,4)||'%'
      AND b.riskcode=A.riskcode
    GROUP BY A.riskcode, A.riskname, c.comcode, c.NAME
      

  2.   

    distinct 效率太低,我们不准加
      

  3.   

    --不需要用分析函数吧,这个
    SELECT d.riskcode 险种代码, d.riskname 险种名称, c.comcode 机构代码, c.name 机构名称 d.prem 保费
      FROM c,
           (SELECT a.riskcode, a.riskname, substr(b.managecom, 1, 4) managecom, SUM(b.prem) prem
              FROM a, b
             WHERE a.riskcode = b.riskcode AND
             GROUP BY a.riskcode, a.riskname, substr(b.managecom, 1, 4)) d,
     WHERE d.managecom || '0000' = c.comcode;
      

  4.   

    你可能理解错了,你不应该加c.comcode LIKE '%0000' 这样sum起来只有分公司的数量,并没有把它下面的子公司也加进来
    我想要的结果是既能把分公司和其子公司加起来,又能够只按分公司名称分组显示
    我的源码如下:SELECT 
     b.riskcode 险种代码,
     b.riskname 险种名称,
     substr(a.managecom,1,4) 分公司代码,
     --(SELECT t.name FROM ldcom t WHERE t.comcode LIKE substr(a.managecom,1,4) || '%') 分公司名称,
     SUM(
     CASE 
     WHEN (d.payyears >= 10 AND d.payintv <> '0') THEN 
      a.SumActuPayMoney*1
     WHEN (d.payyears < 10 AND d.payintv <> '0') THEN 
      a.SumActuPayMoney*(d.payyears/10)
     WHEN (d.payintv = '0') THEN 
      a.SumActuPayMoney*0.1
     END
     ) 总保费  
     FROM ljapayperson a, lmrisk b, ldcom c, lcpol d
     WHERE a.riskcode = b.riskcode
     AND a.managecom = c.comcode 
     AND a.polno = d.polno
     AND a.managecom LIKE substr(a.managecom,1,4)|| '%'
     AND d.appflag <> '0'
     AND d.salechnl in ('1','3') --销售渠道
     AND a.paytype = 'ZC' --正常交费
     --AND a.paytypeflag = '1' --续期 其它则不是
     AND a.confdate BETWEEN date'2009-01-01' AND date'2009-03-31' --生效日期
     GROUP BY b.riskcode, b.riskname,substr(a.managecom,1,4)
    如上源码的结果是只能按照分公司代码分组,但是分公司名称无法显示,我打算使用上面有注释的子查询来显示分公司名称,但是使用后无法分组.
      

  5.   

    错了--(SELECT t.name FROM ldcom t WHERE t.comcode LIKE substr(a.managecom,1,4) || '%') 分公司名称 这句里面应变成--(SELECT t.name FROM ldcom t WHERE t.comcode = substr(a.managecom,1,4) || '0000') 分公司名称 
      

  6.   

    解决了 
    外面在加一层就可以
    --标准折标,包含新单和续期
    SELECT t.险种代码,t.险种名称,t.分公司代码,
    (SELECT name FROM ldcom WHERE comcode = t.分公司代码 || '0000') 分公司名称,
    t.总保费 FROM (SELECT 
     b.riskcode 险种代码,
     b.riskname 险种名称,
     substr(a.managecom,1,4) 分公司代码,
     --(SELECT t.name FROM ldcom t WHERE t.comcode = substr(a.managecom,1,4) || '0000') 分公司名称,
     SUM(
     CASE 
     WHEN (d.payyears >= 10 AND d.payintv <> '0') THEN 
      a.SumActuPayMoney*1
     WHEN (d.payyears < 10 AND d.payintv <> '0') THEN 
      a.SumActuPayMoney*(d.payyears/10)
     WHEN (d.payintv = '0') THEN 
      a.SumActuPayMoney*0.1
     END
     ) 总保费  
     FROM ljapayperson a, lmrisk b, ldcom c, lcpol d
     WHERE a.riskcode = b.riskcode
     AND a.managecom = c.comcode 
     AND a.polno = d.polno
     AND a.managecom LIKE substr(a.managecom,1,4)|| '%'
     AND d.appflag <> '0'
     AND d.salechnl in ('1','3') --销售渠道
     AND a.paytype = 'ZC' --正常交费
     --AND a.paytypeflag = '1' --续期 其它则不是
     AND a.confdate BETWEEN date'2009-01-01' AND date'2009-03-31' --生效日期
     GROUP BY b.riskcode, b.riskname,substr(a.managecom,1,4)) t
      

  7.   

    我的条件里还有这么一条
    AND b.managecom LIKE substr(c.comcode,1,4)||'%'
    sum计算的是b表的数据
    也因此在这里两表要通过like来连接
    你真的有去试着运行吗..
    无语
      

  8.   

    哦 我现在懂你的思路了,你是对的。
    我试的时候把c.comcode 换成了 b.managecom 所以出来的结果不对.
    谢谢了!