Надеюсь, кто-то может мне помочь. Я хочу иметь отчет с расчетами для организационной структуры.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
hmm sorry iam вроде нового для этого .. ive проверил его, но как я могу создать отчет, подобный этому, с CTE? – WhoisIt