我希望有人能幫助我。我想要一份報告,其中包含計算組織結構的報告。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