【问题标题】:SQL dynamic column names based on event order基于事件顺序的 SQL 动态列名
【发布时间】:2016-12-02 20:16:44
【问题描述】:

我需要动态创建基于运行事件命名的列。如果我有这样的数据:

RunID   TestID   Status
-----   ------   ------
1       200      Passed
2       200      Failed
3       300      Failed
4       400      Not Complete
5       400      Passed
6       400      Passed

我需要返回的是:

TestID    Run1          Run2    Run3
------    ----          ----    ----
200       Passed        Failed
300       Failed
400       Not Complete  Passed  Passed

我首先可以调用所有运行,但在动态运行中调整状态以使其自身对齐是我迷路的地方。我是否必须使用 CTE 来获取运行,然后使用一个来获取已调用 TestId 的最大计数,然后基于 1 到 max(count(TestID)) 构建列字符串名称?然后如何将其放入具有正确状态的列中。在我需要的地方也有一个支点吗?

【问题讨论】:

    标签: sql pivot common-table-expression dynamic-sql


    【解决方案1】:

    如果是 SQL Server。

    您可以使用窗口函数 ROW_NUMBER() 来获得不同的运行编号,然后我们只需运行一个动态枢轴以获得最终结果

    Declare @SQL varchar(max) 
    Select  @SQL = Stuff((Select Distinct ',' + QuoteName('Run'+cast(RN as varchar(25))) From (Select Distinct RN=Row_Number() over (Partition By TestID Order By RunID) from YourTable) A Order By 1 For XML Path('')),1,1,'')   
    Select  @SQL = 'Select TestID,' + @SQL + ' 
                    From (
                            Select TestID,Item=''Run''+cast(Row_Number() over (Partition By TestID Order By RunID) as varchar(25)),Value=Status 
                             From  YourTable
                         ) A
                    Pivot (max(Value) For Item in (' + @SQL + ') ) p'
    Exec(@SQL);
    

    返回

    TestID  Run1            Run2      Run3
    200     Passed          Failed    NULL
    300     Failed          NULL      NULL
    400     Not Complete    Passed    Passed
    

    编辑

    Select  Stuff( (Select ',' + QuoteName('Run'+cast(RN as varchar(25))) 
       From ( Select Distinct Top 100 Percent RN=Row_Number() over (Partition By RN_TEST_ID Order By RN_RUN_ID) 
               From  td.RUN 
               Where RN_CYCLE_ID = 501
               Order By 1
            ) A
       For XML Path('')),1,1,'') code
    

    【讨论】:

    • 这太完美了!谢谢,我什至没有考虑构建列名的 XML PATH 解决方案。我想我需要更多地研究一下。谢谢 John Cappelletti,你救了我的理智。
    • @S.G.乐意效劳。研究 XML Path 和窗口函数是值得的。干杯:)
    • 您知道保持“Run”列有序的最佳方法吗?防止“Run1”“Run10”的发生?还要在实际运行中保持“NULL”值而不被推到最后?
    • @S.G.只需在第一个选择中添加 Order by ...) A Order by 1 For XML Path(...
    • @S.G.更新答案以防我的评论不清楚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多