如何解决在SQL上使用两个表进行递归查询的正确顺序是什么?
我有以下两个表:
CREATE TABLE empleados (
id INTEGER PRIMARY KEY,nombre VARCHAR(255) NOT NULL,gerenteId INTEGER,FOREIGN KEY (gerenteId) REFERENCES empleados(id)
);
CREATE TABLE ventas (
id INTEGER PRIMARY KEY,empleadoId INTEGER NOT NULL,valorOrden INTEGER NOT NULL,FOREIGN KEY (empleadoId) REFERENCES empleados(id)
);
具有以下数据:
INSERT INTO empleados(id,nombre,gerenteId) VALUES(1,'Roberto',null);
INSERT INTO empleados(id,gerenteId) VALUES(2,'Tomas',gerenteId) VALUES(3,'Rogelio',1);
INSERT INTO empleados(id,gerenteId) VALUES(4,'Victor',3);
INSERT INTO empleados(id,gerenteId) VALUES(5,'Johnatan',4);
INSERT INTO empleados(id,gerenteId) VALUES(6,'Gustavo',2);
INSERT INTO ventas(id,empleadoId,valorOrden) VALUES(1,3,400);
INSERT INTO ventas(id,valorOrden) VALUES(2,4,3000);
INSERT INTO ventas(id,valorOrden) VALUES(3,5,3500);
INSERT INTO ventas(id,valorOrden) VALUES(4,2,40000);
INSERT INTO ventas(id,valorOrden) VALUES(5,6,3000);
我试图获取一个查询,以获取直接或间接属于主要经理的所有“订单”的总和。主要经理是那些不向他人报告的经理。在这种情况下,罗伯托和托马斯是主要的经理,但可能还有其他经理。结果必须不仅考虑他直接进行的销售(ventas),而且还考虑他们的任何雇员(直接雇员或雇员的雇员)。
所以在这种情况下,我期望得到以下结果:
-- Id TotalVentas
-- ----------------
-- 1 6900
-- 2 43000
“ ID”列是指作为“主要”经理的员工ID,“ TotalVentas”列是由他们及其员工制作的所有ventas(valorOrden)之和。
因此,Roberto没有订单记录,但Rogelio(他的雇员)有400个之一,Victor(Rogelio的雇员)有3000个,Johnatan(Victor雇员)有另一个3500。因此,它们的总和为6900与Tomas的情况相同,他直接制造了一个文塔加他的雇员古斯塔沃(Gustavo)制造的另一个文塔。
到目前为止,我的查询如下:
WITH cte_org AS (
SELECT
id,gerenteId,0 as EmpLevel
FROM
dbo.empleados
WHERE gerenteId IS NULL
UNION ALL
SELECT
e.id,e.nombre,e.gerenteId,o.EmpLevel + 1
FROM
dbo.empleados e
INNER JOIN cte_org o
ON o.id = e.gerenteId
WHERE e.gerenteId IS NOT NULL
)
SELECT cte.id,SUM(s.orderValue)
FROM cte_org cte,dbo.sales s
WHERE (cte.id = s.employeeId AND cte.gerenteId is null)
OR
(cte.id = s.employeeId AND cte.EmpLevel <> 0 AND
cte.gerenteId in (select ee.id from dbo.empleados ee where ee.gerenteId is null)
)
--AND
--(cte.gerenteId in (select ee.id from dbo.empleados ee where ee.gerenteId is null)
--OR
--cte.gerenteId is null)
--AND cte.gerenteId = NULL
group by cte.id
;
有人可以帮我吗?
解决方法
在oracle中,您可以使用以下查询执行此操作:
select manager,sum(amount) as total_amount from
(
select level,CONNECT_BY_ROOT employeeid Manager,a.* from
(
SELECT a.id as employeeid,a.nombre as name,a.GERENTEID as manager_id,b.EMPLEADOID as sales_id,b.VALORORDEN amount
from empleados a left outer join ventas b
on (a.id = b.empleadoId)
) a
start with manager_id is null
connect by prior employeeid = manager_id) x
group by manager;
,
这是遍历层次结构,从最高级别的经理开始,然后加入销售:
with cte as (
select id,nombre,id as manager
from empleados e
where gerenteid is null
union all
select e.id,e.nombre,cte.manager
from cte join
empleados e
on cte.id = e.gerenteid
)
select cte.manager,sum(valororden)
from cte join
ventas v
on cte.id = v.empleadoid
group by cte.manager;
Here是db 小提琴。小提琴使用SQL Server,因为它与您使用的语法一致。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。