I hope someone can help me. I want to have a Report with calculations for an organisation structure.
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' )
My desired result is:
In the table Company
I want to be able to configure the depth of the organisation structure in my report (at the moment view depth 3)
My solution at the Moment:
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
..... and so on until O12
As you can see it's almost only copy/paste just the organisation structure is a little bit different.
Is there a way to create a "cleaner" version to create a Report like that?
I've created a "simple" which has the same structure as my database/tables I have at the moment, so it's not possible to change the table structure.
Thanks in advance.
Before I forget SQL Fiddle Demo