【问题标题】:Subtract 2 Rows into Column multiple times and link back to header多次将 2 行减去 2 行并链接回标题
【发布时间】:2018-03-22 16:59:11
【问题描述】:

我有一些糟糕的数据需要转化为有意义的东西。我意识到这不是表明我已经很久没有使用过 StackOverflow 并且我不确定语法的最佳方式。

我试图写一些查询,但我真的不知道从哪里开始这种查询所以任何帮助将不胜感激,谢谢。

我有一个链接到详细信息表的标题表。在详细信息表中,我有 3 组 2 条记录,我想在其中获取两列之间的差异。

标题表

headerId
1
2

明细表

detailid|headerId|name|totalElapsedMs
1|1|Request1|100
2|1|Response1|1000
3|1|Request2|1100
4|1|Response2|1800
5|1|Request3|2000
6|1|Response3|2600

结果

我想减去彼此匹配的行,然后将它们向上旋转到标题行,如下所示。

headerId|Request1ElapsedMs|Request2ElapsedMs|Request3ElapsedMs
1|900|700|600

【问题讨论】:

    标签: sql-server select pivot


    【解决方案1】:

    我认为在 Detail 表上使用 PIVOT 运算符来获得所需的输出相当简单。假设 @Detail 是您的源表,例如:

    SELECT
        HeaderID
    ,   COALESCE( [Response1], 0 ) - COALESCE( [Request1], 0 ) AS Request1ElapsedMs
    ,   COALESCE( [Response2], 0 ) - COALESCE( [Request2], 0 ) AS Request2ElapsedMs
    ,   COALESCE( [Response3], 0 ) - COALESCE( [Request3], 0 ) AS Request3ElapsedMs
    
    FROM    
        (SELECT HeaderID, Name, TotalElapsedMs FROM @Detail) AS Detail
    PIVOT (SUM( TotalElapsedMs ) FOR Name IN ( [Request1], [Response1], [Request2], [Response2], [Request3], [Response3] )) AS PivotedData
    

    【讨论】:

      【解决方案2】:

      有很多 Pivot 和/或 Dynamic Pivot 的示例。

      这里唯一的技巧是翻转标志,然后聚合

      示例

      Declare @YourTable Table ([detailid] int,[headerId] int,[name] varchar(50),[totalElapsedMs] int)
      Insert Into @YourTable Values 
       (1,1,'Request1',100)
      ,(2,1,'Response1',1000)
      ,(3,1,'Request2',1100)
      ,(4,1,'Response2',1800)
      ,(5,1,'Request3',2000)
      ,(6,1,'Response3',2600)
      
      Select *
       From  (
              Select HeaderId
                    ,Item  = concat('Request',replace(replace(name,'Request',''),'Response',''),'ElapsedMs')
                    ,Value = [totalElapsedMs]*IIF(left(name,3)='Res',1,-1)
                  From @YourTable
              ) src
       Pivot (sum(Value) for Item in ([Request1ElapsedMs],[Request2ElapsedMs],[Request3ElapsedMs]) ) pvt
      

      退货

      HeaderId    Request1ElapsedMs   Request2ElapsedMs   Request3ElapsedMs
      1           900                 700                 600
      

      如果有帮助,子查询“喂养”枢轴生成

      HeaderId    Item                Value
      1           Request1ElapsedMs   -100
      1           Request1ElapsedMs   1000
      1           Request2ElapsedMs   -1100
      1           Request2ElapsedMs   1800
      1           Request3ElapsedMs   -2000
      1           Request3ElapsedMs   2600
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多