【问题标题】:Dynamic PIVOT SQL Server - form/inputs example动态 PIVOT SQL Server - 表单/输入示例
【发布时间】:2018-05-26 12:29:01
【问题描述】:

我需要在动态 PIVOT 中转换 SELECT (image here),其中可以有任何表单名称,并且每个表单可以有不同的输入名称和数量。

我已经完成了根据表单中输入的最大数量设置列的脚本。但我不知道之后如何处理。

DECLARE @ColumnName AS NVARCHAR(MAX);
DECLARE @i INT = 1;

DECLARE @max int = 
    (SELECT
  MAX(y.qtd)
FROM (SELECT TOP 10
  frm_Form,
  frm_Name,
  COUNT(inp_Input) AS qtd
FROM orb_Forms
INNER JOIN orb_FormInputs
  ON frm_Form = fri_Form
INNER JOIN orb_Inputs
  ON fri_Input = inp_Input
WHERE frm_Operation = 1
AND frm_Enabled = 1
AND fri_Enabled = 1
AND inp_Enabled = 1
GROUP BY frm_Form,frm_name
ORDER BY frm_Form desc) y)

WHILE (@i <= @max)
    BEGIN
        select @ColumnName = ISNULL(@ColumnName + ',','') + QUOTENAME('Input' + CAST(@i as nvarchar));
        SET @i = @i + 1;
    END

结果:[输入 1]、[输入 2]、[输入 3]、[输入 4]、[输入 5]、[输入 6]、[输入 7]、[输入 8]、[输入 9]、 [输入 10],[输入 11]

【问题讨论】:

    标签: sql-server forms dynamic pivot


    【解决方案1】:

    一些测试数据

    CREATE TABLE orb_Forms(
      frm_Form varchar(20),
      frm_Name varchar(20),
    )
    
    CREATE TABLE orb_FormInputs(
      fri_Form varchar(20),
      fri_Input varchar(20)
    )
    
    CREATE TABLE orb_Inputs(
      inp_Input varchar(20)
    )
    
    INSERT orb_Forms(frm_Form,frm_Name)VALUES
    ('1','form 1'), ('2','form 2')
    
    INSERT orb_FormInputs(fri_Form,fri_Input)VALUES
    ('1','color'),  ('1','car'),
    ('2','test 1'), ('2','test 2'), ('2','test 3'), ('2','test 4')
    
    INSERT orb_Inputs(inp_Input)VALUES
    ('color'), ('car'), ('test 1'), ('test 2'), ('test 3'), ('test 4')
    

    测试查询

    DECLARE @ColumnName varchar(MAX)='[Input 1],[Input 2],[Input 3],[Input 4],[Input 5],[Input 6],[Input 7],[Input 8],[Input 9],[Input 10],[Input 11]'
    
    DECLARE @query varchar(MAX)='
    SELECT frm_Form,frm_Name,'+@ColumnName+'
    FROM
      (
        SELECT TOP 10 WITH TIES
          frm_Form,
          frm_Name,
          inp_Input,
          CONCAT(''Input '',ROW_NUMBER()OVER(PARTITION BY frm_Form,frm_Name ORDER BY inp_Input)) ColumnName
          --''Input ''+CAST(ROW_NUMBER()OVER(PARTITION BY frm_Form,frm_Name ORDER BY inp_Input) AS varchar(10)) ColumnName
        FROM orb_Forms
        INNER JOIN orb_FormInputs ON frm_Form = fri_Form
        INNER JOIN orb_Inputs ON fri_Input = inp_Input
        --WHERE frm_Operation = 1
        --  AND frm_Enabled = 1
        --  AND fri_Enabled = 1
        --  AND inp_Enabled = 1
        ORDER BY frm_Form desc
      ) q PIVOT(MAX(inp_Input) FOR ColumnName IN('+@ColumnName+')) p
    '
    
    PRINT @query -- check the query
    
    EXEC(@query)
    

    【讨论】:

    • 嗨勒兰,感谢您的回复。我测试并没有工作。我认为这可能是因为在 group by 子句中缺少 inp_Input 并且缺少“作为 PIVOTTABLE”的结尾。添加后,脚本工作,但它显示所有输入 null
    • 我做了一些测试数据并更正了我的查询。它有一些错误,因为我没有测试它。如果它不起作用,请给我一些用于此查询的所有表的真实数据,我将再次检查我的脚本。我评论了WHERE 进行测试。如果您要在真实数据上对其进行测试,则需要取消注释。
    • 非常感谢 Leran,它运行良好。我现在将研究您的脚本以完成最终结果。
    猜你喜欢
    • 2023-04-09
    • 2012-05-11
    相关资源
    最近更新 更多