SQL 基于事件顺序的动态列名
SQL dynamic column names based on event order
我需要动态创建根据 运行 事件命名的列。如果我有这样的数据:
RunID TestID Status
----- ------ ------
1 200 Passed
2 200 Failed
3 300 Failed
4 400 Not Complete
5 400 Passed
6 400 Passed
我需要return的是:
TestID Run1 Run2 Run3
------ ---- ---- ----
200 Passed Failed
300 Failed
400 Not Complete Passed Passed
我首先可以调用所有 运行,但在动态 运行 中旋转状态以对齐自身是我迷路的地方。我是否必须使用 CTE 来获取 运行s,然后使用 CTE 获取已调用的 TestId 的最大计数,然后基于 1 到 max(count(TestID)) 构建列字符串名称?然后我如何将其放入保持正确状态的列中。是我需要的地方的支点吗?
如果SQL服务器。
您可以使用 window 函数 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);
Returns
TestID Run1 Run2 Run3
200 Passed Failed NULL
300 Failed NULL NULL
400 Not Complete Passed Passed
Edit
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
我需要动态创建根据 运行 事件命名的列。如果我有这样的数据:
RunID TestID Status
----- ------ ------
1 200 Passed
2 200 Failed
3 300 Failed
4 400 Not Complete
5 400 Passed
6 400 Passed
我需要return的是:
TestID Run1 Run2 Run3
------ ---- ---- ----
200 Passed Failed
300 Failed
400 Not Complete Passed Passed
我首先可以调用所有 运行,但在动态 运行 中旋转状态以对齐自身是我迷路的地方。我是否必须使用 CTE 来获取 运行s,然后使用 CTE 获取已调用的 TestId 的最大计数,然后基于 1 到 max(count(TestID)) 构建列字符串名称?然后我如何将其放入保持正确状态的列中。是我需要的地方的支点吗?
如果SQL服务器。
您可以使用 window 函数 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);
Returns
TestID Run1 Run2 Run3
200 Passed Failed NULL
300 Failed NULL NULL
400 Not Complete Passed Passed
Edit
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