我有一些可怕的数据,我需要变成某种东西。我意识到这不是最好的方式来展示我多年来一直没有使用StackOverflow而且我不确定语法。
我试过写一些查询,但实际上我不知道从哪种方式开始这种查询,所以任何帮助都会非常感激,谢谢。
我有一个标题表,链接到详细信息表。在详细信息表中,我有3组2条记录,我希望得到两列之间的区别。
标题表
dot -Tpng cfg.main.dot -o main.png
明细表
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
答案 0 :(得分:0)
我认为在详细信息表上使用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
答案 1 :(得分:0)
有许多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