假定有三张表:
表A记录项目与客户的对应关系,某客户可能既同时属于两个项目。
表B记录客户的基本信息,其中有客户的上级客户,上级还可能在上级,一般最多3级。
表C记录客户的消费情况。
-----------------------------------------------------------
表A记录项目与客户的对应关系,某客户可能既同时属于两个项目。
A表
项目名称 客户
1 A项目 客户A
2 A项目 客户B
3 A项目 客户C
4 B项目 客户B
5 B项目 客户D
------------------------------------------------------------------------------
表B记录客户的基本信息,其中有客户的上级客户,上级还可能在上级,一般最多3级。
B表
客户代码 客户名称 上级客户代码
1001 客户A
1002 客户B
1003 客户C
1004 客户D
1005 客户E 1004
-------------------------------------------------------------------------------------------------
表C记录客户的消费情况。
C表
客户代码 客户消费
1001 1.00
1002 2.00
1003 4.00
1004 8.00
1005 32.00
1002 64.00
1001 128.00
1002 256.00
1003 512.00
1004 1024.00
1005 2048.00
-------------------------------------------------------------------------
需要得到的结果如下,请高手指点一下sql语句,实在太难了。既要递归,还要group ,还可能存在重复
得到结果
项目名称 客户 客户层级 客户代码 客户消费 上级客户代码
A项目 客户A 1 1001 129
A项目 客户B 1 1002 322
A项目 客户C 1 1003 516
B项目 客户B 1 1002 322
B项目 客户D 1 1004 1032
B项目 客户E 2 1005 2112 1004
------解决方案--------------------
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.客户代码