select A.项目名称,B1.客户名称,B1.客户层级,C.客户代码,C.客户消费,B1.上级客户代码 from A, (SELECT B.*,LEVEL 客户层级 FROM B CONNECT BY PRIOR 客户代码=上级客户代码 START WITH 上级客户代码 IS NULL) B1, (SELECT 客户代码,SUM(客户消费) 客户消费 FROM C GROUP BY 客户代码) C1 where A.客户代码=C.客户代码 AND B.客户代码=C.客户代码
A表存储的固定是顶级的客户对吧 可以用CONNECT_BY_ROOT(客户代码) 获取某个客户的最上级客户的代码 select A.项目名称,B1.客户名称,B1.客户层级,C.客户代码,C.客户消费,B1.上级客户代码 from A, (SELECT B.*,LEVEL 客户层级,CONNECT_BY_ROOT(客户代码) TREEROOT FROM B CONNECT BY PRIOR 客户代码=上级客户代码 START WITH 上级客户代码 IS NULL) B1, (SELECT 客户代码,SUM(客户消费) 客户消费 FROM C GROUP BY 客户代码) C1 where A.客户代码=C.客户代码 AND B.TREEROOT=C.客户代码
--------------------------------------------------------------------------------------------------------- 非常感谢,用treeroot可以解决这个问题,关键是你分别将递归、group by 分开做子查询,让我思路一下子清晰了!
from A,
(SELECT B.*,LEVEL 客户层级 FROM B
CONNECT BY PRIOR 客户代码=上级客户代码
START WITH 上级客户代码 IS NULL) B1,
(SELECT 客户代码,SUM(客户消费) 客户消费 FROM C
GROUP BY 客户代码) C1
where A.客户代码=C.客户代码 AND B.客户代码=C.客户代码
START WITH 吧
显然是错误的,在上述条件下,如果表A没有将某个客户的下级客户列出,比如上面的客户E,是客户D的下级客户,因为在表A中未直接对应到项目B。但按你的语句也无法被统计在项目B中。
请高手再帮助!
谢谢!
-----------------------------
可以用CONNECT_BY_ROOT(客户代码) 获取某个客户的最上级客户的代码
select A.项目名称,B1.客户名称,B1.客户层级,C.客户代码,C.客户消费,B1.上级客户代码
from A,
(SELECT B.*,LEVEL 客户层级,CONNECT_BY_ROOT(客户代码) TREEROOT FROM B
CONNECT BY PRIOR 客户代码=上级客户代码
START WITH 上级客户代码 IS NULL) B1,
(SELECT 客户代码,SUM(客户消费) 客户消费 FROM C
GROUP BY 客户代码) C1
where A.客户代码=C.客户代码 AND B.TREEROOT=C.客户代码
非常感谢,用treeroot可以解决这个问题,关键是你分别将递归、group by 分开做子查询,让我思路一下子清晰了!