我希望有人能帮助我。我想要一份报告,其中包含计算组织结构的报告。SQL Server:递归CTE?从组织结构创建报告
CREATE TABLE Organistation
(
KeySubCompany NUMERIC(12, 0) ,
O1 VARCHAR(255) ,
O2 VARCHAR(255) ,
O3 VARCHAR(255) ,
O4 VARCHAR(255) ,
O5 VARCHAR(255) ,
O6 VARCHAR(255) ,
O7 VARCHAR(255) ,
O8 VARCHAR(255) ,
O9 VARCHAR(255) ,
O10 VARCHAR(255) ,
O11 VARCHAR(255) ,
O12 VARCHAR(255)
)
INSERT INTO dbo.Organistation
(KeySubCompany, O1, O2, O3, O4, O5, O6, O7, O8, O9, O10, O11, O12)
VALUES (1, 'World', 'Europe', 'Germany', 'Berlin', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(2, 'World', 'Europe', 'Germany', 'Hamburg', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(3, 'World', 'Europe', 'Italy', 'Rom', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(4, 'World', 'Europe', 'Italy', 'Neapel', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(5, 'World', 'Europe', 'Germany', 'Dresden', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(6, 'World', 'North America', 'Canada', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(7, 'World', 'North America', 'USA', 'New York', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
CREATE TABLE COMPANY
(
KeyCompany NUMERIC(12, 0) ,
NAME VARCHAR(255) ,
viewdepth INTEGER
)
INSERT INTO dbo.COMPANY
(KeyCompany, NAME, viewdepth)
VALUES (1, 'Main', 2)
CREATE TABLE SUBCOMPANY
(
KeySubCompany NUMERIC(12, 0) ,
KeyCompany NUMERIC(12, 0) ,
NameSubCompany VARCHAR(255)
)
INSERT INTO dbo.SUBCOMPANY
(KeySubCompany, KeyCompany, NameSubCompany)
VALUES (1, 1, '1_SubCompany'),
(2, 1, '2_SubCompany'),
(3, 1, '3_SubCompany'),
(4, 1, '4_SubCompany'),
(5, 1, '5_SubCompany'),
(6, 1, '6_SubCompany'),
(7, 1, '7_SubCompany')
CREATE TABLE EMPLOYEES
(
EMPLOYID NUMERIC(12, 0) ,
KeySubCompany NUMERIC(12, 0) ,
NAME VARCHAR(255)
)
INSERT INTO dbo.EMPLOYEES
(EMPLOYID, KeySubCompany, NAME)
VALUES (1, 1, 'Winny'),
(1, 1, 'Justin'),
(1, 3, 'Mary'),
(1, 4, 'Leon'),
(1, 4, 'Marcy'),
(1, 7, 'Peter')
我期望的结果是:
在表Company
我希望能够配置组织结构的深度在我的报告(目前视图深度3)
我目前的解决方案:
WITH CompanyRollup
AS (SELECT C.KeyCompany ,
CASE WHEN (GROUPING(O.O1) = 1) THEN ''
ELSE O.O1
END AS O1 ,
NULL AS O2 ,
NULL AS O3 ,
NULL AS O4 ,
NULL AS O5 ,
NULL AS O6 ,
NULL AS O7 ,
NULL AS O8 ,
NULL AS O9 ,
NULL AS O10 ,
NULL AS O11 ,
NULL AS O12 ,
1 AS viewDepth
FROM dbo.COMPANY C
INNER JOIN dbo.SUBCOMPANY SC ON SC.KeyCompany = C.KeyCompany
AND (C.viewdepth + 1) = 1
INNER JOIN dbo.Organistation O ON O.KeySubCompany = SC.KeySubCompany
GROUP BY C.KeyCompany ,
O.O1
WITH ROLLUP
UNION
SELECT C.KeyCompany ,
CASE WHEN (GROUPING(O.O1) = 1) THEN ''
ELSE O.O1
END AS O1 ,
CASE WHEN (GROUPING(O.O2) = 1) THEN ''
ELSE O.O2
END AS O2 ,
NULL AS O3 ,
NULL AS O4 ,
NULL AS O5 ,
NULL AS O6 ,
NULL AS O7 ,
NULL AS O8 ,
NULL AS O9 ,
NULL AS O10 ,
NULL AS O11 ,
NULL AS O12 ,
2 AS viewDepth
FROM dbo.COMPANY C
INNER JOIN dbo.SUBCOMPANY SC ON SC.KeyCompany = C.KeyCompany
AND (C.viewdepth + 1) = 2
INNER JOIN dbo.Organistation O ON O.KeySubCompany = SC.KeySubCompany
GROUP BY C.KeyCompany ,
O.O1 ,
O.O2
WITH ROLLUP
UNION
SELECT C.KeyCompany ,
CASE WHEN (GROUPING(O.O1) = 1) THEN ''
ELSE O.O1
END AS O1 ,
CASE WHEN (GROUPING(O.O2) = 1) THEN ''
ELSE O.O2
END AS O2 ,
CASE WHEN (GROUPING(O.O3) = 1) THEN ''
ELSE O.O3
END AS O3 ,
NULL AS O4 ,
NULL AS O5 ,
NULL AS O6 ,
NULL AS O7 ,
NULL AS O8 ,
NULL AS O9 ,
NULL AS O10 ,
NULL AS O11 ,
NULL AS O12 ,
3 AS viewDepth
FROM dbo.COMPANY C
INNER JOIN dbo.SUBCOMPANY SC ON SC.KeyCompany = C.KeyCompany
AND (C.viewdepth + 1) = 3
INNER JOIN dbo.Organistation O ON O.KeySubCompany = SC.KeySubCompany
GROUP BY C.KeyCompany ,
O.O1 ,
O.O2 ,
O.O3
WITH ROLLUP
)
SELECT CR.KeyCompany ,
SUM(SE.EMPLOYID) CountEmployees ,
CR.O1 ,
NULL AS O2,
NULL AS O3,
NULL AS O4,
NULL AS O5,
NULL AS O6,
NULL AS O7,
NULL AS O8,
NULL AS O9,
NULL AS O10,
NULL AS O11,
NULL AS O12
FROM CompanyRollup CR
INNER JOIN (SELECT DISTINCT
KeyCompany ,
EMPLOYID
FROM dbo.EMPLOYEES E
INNER JOIN dbo.SUBCOMPANY SSC ON SSC.KeySubCompany = E.KeySubCompany
) SE ON SE.KeyCompany = CR.KeyCompany
INNER JOIN (SELECT SSSC.KeyCompany ,
SO.*
FROM dbo.SUBCOMPANY SSSC
INNER JOIN dbo.Organistation SO ON SSSC.KeySubCompany = SO.KeySubCompany
) SOO ON SOO.KeyCompany = CR.KeyCOmpany
AND (CR.O1 = ''
OR ISNULL(CR.O1, '') = ISNULL(SOO.O1, '')
)
WHERE CR.Viewdepth = 1
GROUP BY CR.KeyCompany ,
CR.O1
UNION
SELECT CR.KeyCompany ,
SUM(SE.EMPLOYID) CountEmployees ,
CR.O1 ,
CR.O2 ,
NULL AS O3,
NULL AS O4,
NULL AS O5,
NULL AS O6,
NULL AS O7,
NULL AS O8,
NULL AS O9,
NULL AS O10,
NULL AS O11,
NULL AS O12
FROM CompanyRollup CR
INNER JOIN (SELECT DISTINCT
KeyCompany ,
EMPLOYID
FROM dbo.EMPLOYEES E
INNER JOIN dbo.SUBCOMPANY SSC ON SSC.KeySubCompany = E.KeySubCompany
) SE ON SE.KeyCompany = CR.KeyCompany
INNER JOIN (SELECT SSSC.KeyCompany ,
SO.*
FROM dbo.SUBCOMPANY SSSC
INNER JOIN dbo.Organistation SO ON SSSC.KeySubCompany = SO.KeySubCompany
) SOO ON SOO.KeyCompany = CR.KeyCOmpany
AND (CR.O1 = ''
OR ISNULL(CR.O1, '') = ISNULL(SOO.O1, '')
)AND (CR.O2 = ''
OR ISNULL(CR.O2, '') = ISNULL(SOO.O2, '')
)
WHERE CR.Viewdepth = 2
GROUP BY CR.KeyCompany ,
CR.O1,
CR.O2
UNION
SELECT CR.KeyCompany ,
SUM(SE.EMPLOYID) CountEmployees ,
CR.O1 AS O1,
CR.O2 AS O2,
CR.O3 AS O3,
NULL AS O4,
NULL AS O5,
NULL AS O6,
NULL AS O7,
NULL AS O8,
NULL AS O9,
NULL AS O10,
NULL AS O11,
NULL AS O12
FROM CompanyRollup CR
INNER JOIN (SELECT DISTINCT
KeyCompany ,
EMPLOYID
FROM dbo.EMPLOYEES E
INNER JOIN dbo.SUBCOMPANY SSC ON SSC.KeySubCompany = E.KeySubCompany
) SE ON SE.KeyCompany = CR.KeyCompany
INNER JOIN (SELECT SSSC.KeyCompany ,
SO.*
FROM dbo.SUBCOMPANY SSSC
INNER JOIN dbo.Organistation SO ON SSSC.KeySubCompany = SO.KeySubCompany
) SOO ON SOO.KeyCompany = CR.KeyCOmpany
AND (CR.O1 = ''
OR ISNULL(CR.O1, '') = ISNULL(SOO.O1, '')
)AND (CR.O2 = ''
OR ISNULL(CR.O2, '') = ISNULL(SOO.O2, '')
) AND (CR.O3 = ''
OR ISNULL(CR.O3, '') = ISNULL(SOO.O3, '')
)
WHERE CR.Viewdepth = 3
GROUP BY CR.KeyCompany ,
CR.O1,
CR.O2,
CR.O3.... UNION.... UNTIL O12
.....等等,直到O12
正如你所看到的,它几乎只是复制/粘贴组织结构有点不同。
有没有一种方法来创建一个“干净”的版本来创建一个这样的报告?
我创建具有相同的结构,我的数据库/表我目前所面对的一个“简单”,所以它不可能改变表结构。
在此先感谢。
之前,我忘了SQL Fiddle Demo
是的。使用CTE。阅读http://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx和http://msdn.microsoft.com/en-gb/library/ms175972.aspx – podiluska
ok thx我会检查出来 – WhoisIt
嗯对不起IAM这种新的..这个检查出来,但我怎么能创建一个这样的CTE报告? – WhoisIt