如何按名称对某些记录进行分组并转动某些值

时间:2017-02-21 18:06:24

标签: sql sql-server pivot

我正在研究一个SQL查询,将View by Id的结果分组,每个Id只有一行 最多三个透视结果并保持一些列静态:TestCaseId,TestName,测试用例号,所有者

实际上这是我创建的查询以获得所需的输出,但现在正在按预期工作,因为MAX总是在重新获取最大值,所以我只得到一行,但是旋转的值重复到右边。

SELECT DISTINCT  TBL1.[TestName], TBL1.[Test Case Num], TBL1.[Owner], MAX(TBL1.[Browser]) as 'Column1', MAX(TBL1.[Run Date]) as 'Column2', MAX(TBL1.[Status]) as 'Column3', MAX(TBL1.[Duration]) as 'Column4', MAX(TBL1.[ErrorMsg]) as 'Column5', MAX(TBL2.[Browser]) as 'Column6', MAX(TBL2.[Run Date]) as 'Column7', MAX(TBL2.[Status]) as 'Column8', MAX(TBL2.[Duration]) as 'Column9', MAX(TBL2.[ErrorMsg]) as 'Column10', MAX(TBL3.[Browser]) as 'Column11' , MAX(TBL3.[Run Date]) as 'Column12', MAX(TBL3.[Status]) as 'Column13', MAX(TBL3.[Duration]) as 'Column14', MAX(TBL3.[ErrorMsg]) as 'Column15' 
FROM (SELECT DISTINCT T1.[TestCaseId], T1.[TestName], T1.[Test Case Num], T1.[Owner], T1.[Browser], T1.[Run Date], T1.[Status], T1.[Duration], T1.[ErrorMsg]
FROM [TestRunner].[dbo].RunsRawResults T1) TBL1
cross apply (SELECT DISTINCT T2.[TestCaseId], T2.[Browser], T2.[Run Date], T2.[Status], T2.[Duration], T2.[ErrorMsg]
            FROM [TestRunner].[dbo].RunsRawResults T2
            WHERE T2.[TestCaseId] = TBL1.[TestCaseId] AND T2.[Run Date]  TBL1.[Run Date]) TBL2
cross apply (SELECT DISTINCT T3.[TestCaseId], T3.[Browser], T3.[Run Date], T3.[Status], T3.[Duration], T3.[ErrorMsg]
            FROM [TestRunner].[dbo].RunsRawResults T3
            WHERE T3.[TestCaseId] = TBL2.[TestCaseId] AND T3.[Run Date]  TBL2.[Run Date] AND  T3.[Run Date]  TBL1.[Run Date]) TBL3
            GROUP BY TBL1.[TestCaseId], TBL1.[TestName], TBL1.[Test Case Num], TBL1.[Owner]

输入 - 原始数据(来自RunRawResults视图) enter image description here 期望和透视输出

enter image description here

1 个答案:

答案 0 :(得分:0)

使用common table expression (cte)row_number(),我们可以简化多个运行日期的标识和顺序。这也让我们可以跳过使用distinctgroup by

切换为outer apply可让我们在TestCaseId每次运行少于3次的情况下包含结果。

;with cte as (
  select *
    , rn = row_number() over (
        partition by TestCaseId
        order by [Run Date]
        )
  from TestRunner.dbo.RunsRawResults
)
select 
    tbl1.TestName
  , tbl1.[Test Case Num]
  , tbl1.Owner
  , tbl1.Browser
  , [Run Date]_tbl1 = tbl1.[Run Date]
  , Status_tbl1     = tbl1.Status
  , Duration_tbl1   = tbl1.Duration
  , ErrorMsg_tbl1   = tbl1.ErrorMsg
  , Browser_tbl2    = tbl2.Browser
  , [Run Date]_tbl2 = tbl2.[Run Date]
  , Status_tbl2     = tbl2.Status
  , Duration_tbl2   = tbl2.Duration
  , ErrorMsg_tbl2   = tbl2.ErrorMsg
  , Browser_tbl3    = tbl3.Browser
  , [Run Date]_tbl3 = tbl3.[Run Date]
  , Status_tbl3     = tbl3.Status
  , Duration_tbl3   = tbl3.Duration
  , ErrorMsg_tbl3   = tbl3.ErrorMsg
from cte as tbl1
  outer apply (
    select 
        i.[Run Date]
      , i.Status
      , i.Duration
      , i.ErrorMsg
    from cte as i
    where i.TestCaseId = tbl1.TestCaseId 
      and i.rn = 2
   ) as tbl2
  outer apply (
    select 
        i.[Run Date]
      , i.Status
      , i.Duration
      , i.ErrorMsg
    from cte as i
    where i.TestCaseId = tbl1.TestCaseId 
      and i.rn = 3
   ) as tbl3
where tbl1.rn = 1