Sql server 将两行减法到列中多次,并链接回标题

Sql server 将两行减法到列中多次,并链接回标题,sql-server,select,pivot,Sql Server,Select,Pivot,我有一些可怕的数据,我需要把它们变成有意义的东西。我意识到这不是最好的方式来表明我已经很久没有使用StackOverflow了,我也不确定语法 我试着写一些查询,但我真的不知道从哪里开始这样的查询,所以任何帮助都将不胜感激,谢谢 我有一个链接到详细信息表的标题表。在details表中,我有3组2条记录,其中我想得到两列之间的差异 标题表 headerId 1 2 detailid|headerId|name|totalElapsedMs 1|1|Request1|100 2|1|Respons

我有一些可怕的数据,我需要把它们变成有意义的东西。我意识到这不是最好的方式来表明我已经很久没有使用StackOverflow了,我也不确定语法

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

我有一个链接到详细信息表的标题表。在details表中,我有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
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
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
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|Request1ElapsedMs|Request2ElapsedMs|Request3ElapsedMs
1|900|700|600

我认为在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

有许多枢轴和/或动态枢轴的示例

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

示例

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
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