【问题标题】:SQL Server : create dynamic table based on parameter inputSQL Server:根据参数输入创建动态表
【发布时间】:2019-09-29 09:29:22
【问题描述】:

我想根据我的报表用户的输入参数创建一个动态表。选择ProfitCenterID 时,我希望此ProfitCenterID 显示为1 级,所有子ProfitCenterID 显示为2 级到xx 级。

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

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

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

时间:

ProfitcenterID_Level4(与“业务单元 A”一样)WHERE 子句必须使用列 ProfitCenterID_Level_04

ProfitcenterID_Level5(因为它是“帐户 1”),WHERE 子句必须使用列 ProfitCenterID_Level_05

ProfitcenterID_Level6(因为它是“D-123400”),WHERE 子句必须使用列 ProfitCenterID_Level_06

我不知道如何根据ProfitcenterID 中的值创建此查找,它为我提供ProfitcenterID_Level

下面的示例数据和期望的结果示例。

样本数据:

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')

所需结果(在选择“业务单位时” - 级别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  ******/

所需结果(在选择“帐户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  ******/

【问题讨论】:

  • 你能发布一些示例数据吗?
  • 请不要张贴图片来显示您的样本和预期结果;他们无法帮助您寻求帮助的用户,因为我们无法利用他们。花点时间发布 DDL 和 DML 语句,并格式化 text 以获得您的预期结果。不要忘记包括您的尝试。
  • 大家好。感谢您的投入。我在下面的答案中包含了我的示例数据。
  • 好的,所以您的要求是获得一个动态表,其中当您选择业务单位时,应显示业务单位列,否则如果您选择帐户,则应跳过业务单位列和行,仅应显示帐户显示对了吗?
  • 在图像中你也显示到 4 级和 3 级,所以不需要其他级别?

标签: sql-server tableau-api


【解决方案1】:

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

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'

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-07-10
      • 2020-02-01
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 2022-11-24
      相关资源
      最近更新 更多