SQL Server:根据参数输入创建动态表

时间:2019-05-11 23:41:43

标签: sql-server tableau

我想基于报表用户的输入参数创建动态表。选择ProfitCenterID时,我希望将此ProfitCenterID显示为1级,并将所有孩子ProfitCenterID显示为2级至xx级。

当参数/ ProfitCenterID设置为“业务部门A”时,我需要一个表,其中包含此层次结构中的所有ProfitcenterID。下面有一个示例显示所需的结果。

我的ProfitCenterID的结构如下面的示例数据所示。我的实际生产数据直到19级,用户可以从ProfitCenterID列中选择输入值参数。

我的报告工具是Tableau,我使用带有参数的自定义SQL查询连接到MS SQL Server数据库。

何时:

ProfitcenterID_Level 4 (对于“业务部门A”而言),WHERE子句必须使用列ProfitCenterID_Level_04

ProfitcenterID_Level 5 (与“帐户1”相同),WHERE子句必须使用列ProfitCenterID_Level_05

ProfitcenterID_Level 6 (与“ D-123400”相同),WHERE子句必须使用列ProfitCenterID_Level_06

我不知道如何创建基于ProfitcenterID_Level中的值的ProfitcenterID查找。

以下示例数据和所需结果示例。

样本数据:

CREATE TABLE [Sample]
(
    ProfitCenterID nchar(30)
    ,ProfitCenterID_Level smallint
    ,ProfitCenterID_Level_01 nchar(30)
    ,ProfitCenterID_Level_02 nchar(30)
    ,ProfitCenterID_Level_03 nchar(30)
    ,ProfitCenterID_Level_04 nchar(30)
    ,ProfitCenterID_Level_05 nchar(30)
    ,ProfitCenterID_Level_06 nchar(30)
    ,ProfitCenterID_Level_07 nchar(30)
)

INSERT INTO [Sample]
VALUES ('Business Unit A','4','Global Enterprise','Europe','Denmark','Business Unit A','','',''),
('Account 1','5','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','',''),
('D-123400','6','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123400',''),
('D-123410','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123460','D-123410'),
('D-123420','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123460','D-123420'),
('D-123430','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123460','D-123430'),
('D-123440','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123460','D-123440'),
('D-123450','6','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123450',''),
('D-123460','6','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123460',''),
('D-123465','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123490','D-123465'),
('D-123470','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123460','D-123470'),
('D-123480','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123460','D-123480'),
('D-123483','6','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123483',''),
('D-123485','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123490','D-123485'),
('D-123486','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123490','D-123486'),
('D-123487','6','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123487',''),
('D-123488','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123490','D-123488'),
('D-123489','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123490','D-123489'),
('D-123490','6','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123490',''),
('D-123491','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123490','D-123491'),
('D-123492','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123490','D-123492'),
('D-123493','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123490','D-123493'),
('D-123494','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123490','D-123494'),
('D-123495','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123490','D-123495'),
('D-123496','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123490','D-123496'),
('D-123497','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123490','D-123497'),
('D-123498','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123490','D-123498'),
('D-123499','7','Global Enterprise','Europe','Denmark','Business Unit A','Account 1  ','D-123490','D-123499')

enter image description here

所需结果(当选择“业务部门A”- 4级时):

    SELECT [ProfitCenterID]
          ,[ProfitCenterID_Level]
          -- ,[ProfitCenterID_Level_01]
          -- ,[ProfitCenterID_Level_02]
          -- ,[ProfitCenterID_Level_03]
          ,[ProfitCenterID_Level_04] AS 'Level 01'
          ,[ProfitCenterID_Level_05] AS 'Level 02'
          ,[ProfitCenterID_Level_06] AS 'Level 03'
          ,[ProfitCenterID_Level_07] AS 'Level 04'
      FROM [MyDatabase].[dbo].[Sample]
      WHERE ProfitCenterID_Level_04 = 'Business Unit A' 
 /****** 'Business Unit A' is the input parameter from my report user  ******/

enter image description here

所需结果(在选择“帐户1”- 5级时):

    SELECT [ProfitCenterID]
          ,[ProfitCenterID_Level]
          -- ,[ProfitCenterID_Level_01]
          -- ,[ProfitCenterID_Level_02]
          -- ,[ProfitCenterID_Level_03]
          -- ,[ProfitCenterID_Level_04]
          ,[ProfitCenterID_Level_05] AS 'Level 01'
          ,[ProfitCenterID_Level_06] AS 'Level 02'
          ,[ProfitCenterID_Level_07] AS 'Level 03'
      FROM [MyDatabase].[dbo].[Sample]
      WHERE ProfitCenterID_Level_05 = 'Account 1' 
/****** 'Account 1' is the input parameter from my report user  ******/

enter image description here

2 个答案:

答案 0 :(得分:0)

我终于设法解决了我的问题。感谢大家的投入。这是我解决的方法。

SELECT S.ProfitCenterID, S.ProfitCenterID_Level
    ,CASE 
        WHEN L.ProfitCenterID_Level = 1 THEN S.ProfitCenterID_Level_01
        WHEN L.ProfitCenterID_Level = 2 THEN S.ProfitCenterID_Level_02
        WHEN L.ProfitCenterID_Level = 3 THEN S.ProfitCenterID_Level_03
        WHEN L.ProfitCenterID_Level = 4 THEN S.ProfitCenterID_Level_04
        WHEN L.ProfitCenterID_Level = 5 THEN S.ProfitCenterID_Level_05
        WHEN L.ProfitCenterID_Level = 6 THEN S.ProfitCenterID_Level_06
        WHEN L.ProfitCenterID_Level = 7 THEN S.ProfitCenterID_Level_07
    END AS [Level 1]
    ,CASE 
        WHEN L.ProfitCenterID_Level = 1 THEN S.ProfitCenterID_Level_02
        WHEN L.ProfitCenterID_Level = 2 THEN S.ProfitCenterID_Level_03
        WHEN L.ProfitCenterID_Level = 3 THEN S.ProfitCenterID_Level_04
        WHEN L.ProfitCenterID_Level = 4 THEN S.ProfitCenterID_Level_05
        WHEN L.ProfitCenterID_Level = 5 THEN S.ProfitCenterID_Level_06
        WHEN L.ProfitCenterID_Level = 6 THEN S.ProfitCenterID_Level_07
        -- WHEN L.ProfitCenterID_Level = 7 THEN S.ProfitCenterID_Level_08
    END AS [Level 2]
    ,CASE 
        WHEN L.ProfitCenterID_Level = 1 THEN S.ProfitCenterID_Level_03
        WHEN L.ProfitCenterID_Level = 2 THEN S.ProfitCenterID_Level_04
        WHEN L.ProfitCenterID_Level = 3 THEN S.ProfitCenterID_Level_05
        WHEN L.ProfitCenterID_Level = 4 THEN S.ProfitCenterID_Level_06
        WHEN L.ProfitCenterID_Level = 5 THEN S.ProfitCenterID_Level_07
        --WHEN L.ProfitCenterID_Level = 6 THEN S.ProfitCenterID_Level_08
        --WHEN L.ProfitCenterID_Level = 7 THEN S.ProfitCenterID_Level_09
    END AS [Level 3]
    ,CASE 
        WHEN L.ProfitCenterID_Level = 1 THEN S.ProfitCenterID_Level_04
        WHEN L.ProfitCenterID_Level = 2 THEN S.ProfitCenterID_Level_05
        WHEN L.ProfitCenterID_Level = 3 THEN S.ProfitCenterID_Level_06
        WHEN L.ProfitCenterID_Level = 4 THEN S.ProfitCenterID_Level_07
        --WHEN L.ProfitCenterID_Level = 5 THEN S.ProfitCenterID_Level_08
        --WHEN L.ProfitCenterID_Level = 6 THEN S.ProfitCenterID_Level_09
        --WHEN L.ProfitCenterID_Level = 7 THEN S.ProfitCenterID_Level_10
    END AS [Level 4]
FROM [MyDatabase].[dbo].[Sample] AS S
JOIN [MyDatabase].[dbo].[Sample] AS L
ON 'Business Unit A' = L.ProfitCenterID
WHERE CASE 
        WHEN L.ProfitCenterID_Level = 1 THEN S.ProfitCenterID_Level_01
        WHEN L.ProfitCenterID_Level = 2 THEN S.ProfitCenterID_Level_02
        WHEN L.ProfitCenterID_Level = 3 THEN S.ProfitCenterID_Level_03
        WHEN L.ProfitCenterID_Level = 4 THEN S.ProfitCenterID_Level_04
        WHEN L.ProfitCenterID_Level = 5 THEN S.ProfitCenterID_Level_05
        WHEN L.ProfitCenterID_Level = 6 THEN S.ProfitCenterID_Level_06
        WHEN L.ProfitCenterID_Level = 7 THEN S.ProfitCenterID_Level_07
    END = 'Business Unit A'

答案 1 :(得分:0)

我能够使用示例重新创建报告,并且能够实现所需的功能。

如果需要,我可以共享工作簿