多次将2行减去列并链接回标题

时间:2018-03-22 16:59:11

标签: sql-server select pivot

我有一些可怕的数据,我需要变成某种东西。我意识到这不是最好的方式来展示我多年来一直没有使用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

2 个答案:

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