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