如何根据SQL服务器所有负责下属的销售额得出直属下属的总销售额?
How to get the total sales of immediate subordinate based on sales of all subordinate in charge in SQL Server?
结构如下:
ID_EMPLOYEE ID_EMPLOYEE_BOSS LEVEL
-------------------------------------------
100 NULL 1
201 100 2
202 100 2
301 201 3
302 201 3
303 202 3
304 202 3
401 302 4
402 302 4
403 302 4
N N-1 N
以及销售结构
ID_EMPLOYEE SALE DATE
401 1100.00 2015-06-07
402 1500.00 2015-06-05
403 1400.00 2015-06-25
303 5000.00 2015-05-25
304 8250.00 2015-05-25
我试过了
WITH Sales_CTE (ID_EMPLOYEE, SALE, MONTHS)
AS
(
SELECT ID_EMPLOYEE, sum(SALE), DATEPART(mm,DATE)
FROM SALES
GROUP BY ID_EMPLOYEE, DATEPART(mm,DATE)
)
SELECT JE.ID_EMPLOYEE, OS.SALE, OS.MONTHS,
JE.ID_EMPLOYEE_BOSS, OM.SALE, OM.MONTHS
FROM EMPLOYEES AS JE
JOIN Sales_CTE AS OS
ON JE.ID_EMPLOYEE= OS.ID_EMPLOYEE
LEFT OUTER JOIN Sales_CTE AS OM
ON JE.ID_EMPLOYEE_BOSS= OM.ID_EMPLOYEE
WHERE ID_EMPLOYEE_BOSS= 302
ORDER BY JE.ID_EMPLOYEE_BOSS;
目前只有n-1级销售人员可以直接看到,但我想显示如下。例如员工 100 可以看到
ID_EMPLOYEE SALES MONTH
201 4000 6
202 13250 5
这n关
准备架构
CREATE TABLE STRUCTURE(ID_EMPLOYEE INT, ID_EMPLOYEE_BOSS INT, LEVEL INT)
CREATE TABLE SALES(ID_EMPLOYEE INT,SALE INT,DDATE DATE)
准备数据
INSERT INTO STRUCTURE VALUES (100,NULL,1)
INSERT INTO STRUCTURE VALUES (201,100, 2)
INSERT INTO STRUCTURE VALUES (202,100, 2)
INSERT INTO STRUCTURE VALUES (301,201, 3)
INSERT INTO STRUCTURE VALUES (302,201, 3)
INSERT INTO STRUCTURE VALUES (303,202, 3)
INSERT INTO STRUCTURE VALUES (304,202, 3)
INSERT INTO STRUCTURE VALUES (401,302, 4)
INSERT INTO STRUCTURE VALUES (402,302, 4)
INSERT INTO STRUCTURE VALUES (403,302, 4)
INSERT INTO SALES VALUES(401,1100.00,'2015-06-07')
INSERT INTO SALES VALUES(402,1500.00,'2015-06-05')
INSERT INTO SALES VALUES(403,1400.00,'2015-06-25')
INSERT INTO SALES VALUES(303,5000.00,'2015-05-25')
INSERT INTO SALES VALUES(304,8250.00,'2015-05-25')
查询
WITH Sales_CTE
AS
(
SELECT ID_EMPLOYEE,ID_EMPLOYEE_BOSS,ID_EMPLOYEE AS ROOTID
FROM STRUCTURE
WHERE ID_EMPLOYEE_BOSS=100
UNION ALL
SELECT S.ID_EMPLOYEE,S.ID_EMPLOYEE_BOSS,SC.ROOTID
FROM STRUCTURE S
INNER JOIN Sales_CTE SC ON SC.ID_EMPLOYEE = S.ID_EMPLOYEE_BOSS
)
SELECT SC.ROOTID AS ID_EMPLOYEE,SUM(S.SALE) AS SALES,MONTH(S.DDATE) AS [MONTH]
FROM Sales_CTE SC
INNER JOIN SALES S ON S.ID_EMPLOYEE = SC.ID_EMPLOYEE
GROUP BY SC.ROOTID,MONTH(S.DDATE)
ORDER BY SC.ROOTID,MONTH(S.DDATE)
SQL Fiddle : http://sqlfiddle.com/#!3/b641d/1
结构如下:
ID_EMPLOYEE ID_EMPLOYEE_BOSS LEVEL
-------------------------------------------
100 NULL 1
201 100 2
202 100 2
301 201 3
302 201 3
303 202 3
304 202 3
401 302 4
402 302 4
403 302 4
N N-1 N
以及销售结构
ID_EMPLOYEE SALE DATE
401 1100.00 2015-06-07
402 1500.00 2015-06-05
403 1400.00 2015-06-25
303 5000.00 2015-05-25
304 8250.00 2015-05-25
我试过了
WITH Sales_CTE (ID_EMPLOYEE, SALE, MONTHS)
AS
(
SELECT ID_EMPLOYEE, sum(SALE), DATEPART(mm,DATE)
FROM SALES
GROUP BY ID_EMPLOYEE, DATEPART(mm,DATE)
)
SELECT JE.ID_EMPLOYEE, OS.SALE, OS.MONTHS,
JE.ID_EMPLOYEE_BOSS, OM.SALE, OM.MONTHS
FROM EMPLOYEES AS JE
JOIN Sales_CTE AS OS
ON JE.ID_EMPLOYEE= OS.ID_EMPLOYEE
LEFT OUTER JOIN Sales_CTE AS OM
ON JE.ID_EMPLOYEE_BOSS= OM.ID_EMPLOYEE
WHERE ID_EMPLOYEE_BOSS= 302
ORDER BY JE.ID_EMPLOYEE_BOSS;
目前只有n-1级销售人员可以直接看到,但我想显示如下。例如员工 100 可以看到
ID_EMPLOYEE SALES MONTH
201 4000 6
202 13250 5
这n关
准备架构
CREATE TABLE STRUCTURE(ID_EMPLOYEE INT, ID_EMPLOYEE_BOSS INT, LEVEL INT)
CREATE TABLE SALES(ID_EMPLOYEE INT,SALE INT,DDATE DATE)
准备数据
INSERT INTO STRUCTURE VALUES (100,NULL,1)
INSERT INTO STRUCTURE VALUES (201,100, 2)
INSERT INTO STRUCTURE VALUES (202,100, 2)
INSERT INTO STRUCTURE VALUES (301,201, 3)
INSERT INTO STRUCTURE VALUES (302,201, 3)
INSERT INTO STRUCTURE VALUES (303,202, 3)
INSERT INTO STRUCTURE VALUES (304,202, 3)
INSERT INTO STRUCTURE VALUES (401,302, 4)
INSERT INTO STRUCTURE VALUES (402,302, 4)
INSERT INTO STRUCTURE VALUES (403,302, 4)
INSERT INTO SALES VALUES(401,1100.00,'2015-06-07')
INSERT INTO SALES VALUES(402,1500.00,'2015-06-05')
INSERT INTO SALES VALUES(403,1400.00,'2015-06-25')
INSERT INTO SALES VALUES(303,5000.00,'2015-05-25')
INSERT INTO SALES VALUES(304,8250.00,'2015-05-25')
查询
WITH Sales_CTE
AS
(
SELECT ID_EMPLOYEE,ID_EMPLOYEE_BOSS,ID_EMPLOYEE AS ROOTID
FROM STRUCTURE
WHERE ID_EMPLOYEE_BOSS=100
UNION ALL
SELECT S.ID_EMPLOYEE,S.ID_EMPLOYEE_BOSS,SC.ROOTID
FROM STRUCTURE S
INNER JOIN Sales_CTE SC ON SC.ID_EMPLOYEE = S.ID_EMPLOYEE_BOSS
)
SELECT SC.ROOTID AS ID_EMPLOYEE,SUM(S.SALE) AS SALES,MONTH(S.DDATE) AS [MONTH]
FROM Sales_CTE SC
INNER JOIN SALES S ON S.ID_EMPLOYEE = SC.ID_EMPLOYEE
GROUP BY SC.ROOTID,MONTH(S.DDATE)
ORDER BY SC.ROOTID,MONTH(S.DDATE)
SQL Fiddle : http://sqlfiddle.com/#!3/b641d/1