SQL Server 2016合并行在数据透视表中

时间:2017-10-23 16:43:42

标签: sql sql-server pivot-table

我在SQL Server 2016中使用以下查询创建了一个数据透视表。

WITH PivotData AS
(
select [T_Spec_Char].[ID],
    format([T_Sample].[TimeStamp], 'dd/MM/yyyy') as DT,
    format([T_Sample].[TimeStamp], 'hh:mm:ss') as TM,
    [T_Spec_Char].[Spec_Char],
    [T_Spec].[Line],
    cast([T_Sample].[Value] as float) as Val
from [ABC].[dbo].[T_Spec_Char], [ABC].[dbo].[T_Sample], [ABC].[dbo].[T_Spec] 
where [T_Sample].[Spec_Char_ID] = [T_Spec_Char].[ID] and 
    ([T_Spec_Char].[Spec_Char] = 'Zone1Temp' or [T_Spec_Char].[Spec_Char] = 'Zone2Temp' 
    or [T_Spec_Char].[Spec_Char] = 'Zone3Temp') 
    and [T_Sample].[Spec_ID] = [T_Spec].[ID]
group by [T_Spec_Char].[ID], [T_Sample].[TimeStamp], [T_Spec_Char].[Spec_Char], 
    [T_Spec].[Line], [T_Sample].[Value]
)

SELECT
    DT,
    TM,
    [Line],
    Zone1Temp, 
    Zone2Temp, 
    Zone3Temp
FROM PivotData
PIVOT
(
    SUM(Val)
    FOR Spec_Char
    IN (Zone1Temp, Zone2Temp, Zone3Temp)
) AS PivotResult
ORDER BY DT, TM

结果显示如下:

DT          TM          Line    Zone1Temp  Zone2Temp  Zone3Temp  
07/02/2017  01:21:55    Line2   310        NULL       NULL
07/02/2017  01:21:55    Line2   NULL       330        NULL
07/02/2017  01:21:55    Line2   NULL       NULL       345
07/02/2017  01:51:56    Line2   310        NULL       NULL
07/02/2017  01:51:57    Line2   NULL       330        NULL
07/02/2017  01:51:57    Line2   NULL       NULL       345
07/02/2017  02:21:56    Line2   310        NULL       NULL
07/02/2017  02:21:56    Line2   NULL       330        NULL
07/02/2017  02:21:56    Line2   NULL       NULL       345
07/02/2017  02:51:56    Line2   310        NULL       NULL
07/02/2017  02:51:56    Line2   NULL       330        NULL
07/02/2017  02:51:56    Line2   NULL       NULL       345
07/02/2017  03:21:56    Line2   310        NULL       NULL
07/02/2017  03:21:56    Line2   NULL       330        NULL
07/02/2017  03:21:58    Line2   NULL       NULL       345
07/02/2017  03:51:56    Line2   310        NULL       NULL
07/02/2017  03:51:57    Line2   NULL       330        NULL
07/02/2017  03:51:57    Line2   NULL       NULL       345

如何将具有相同日期和时间的行(例如上面查询结果中的前3行)合并为一行?

@Noxthron。您的查询产生以下内容:

DT          TM          Line    Temp
07/02/2017  01:21:55    Line2   310
07/02/2017  01:21:55    Line2   330
07/02/2017  01:21:55    Line2   345
07/02/2017  01:51:56    Line2   310

I would like to be able to see:
DT          TM          Line    Zone1Temp  Zone2Temp  Zone3Temp  
07/02/2017  01:21:55    Line2   310        330        345

3 个答案:

答案 0 :(得分:0)

未经测试,但您应该使用类似的内容对这些行进行分组:

SELECT
    DT,
    TM,
    [Line],
    COALESCE(Zone1Temp, Zone2Temp, Zone3Temp) AS Temp
FROM PivotData
PIVOT
(
    SUM(Val)
    FOR Spec_Char
    IN (Zone1Temp, Zone2Temp, Zone3Temp)
) AS PivotResult
GROUP BY DT, TM, [Line], COALESCE(Zone1Temp, Zone2Temp, Zone3Temp)
ORDER BY DT, TM

答案 1 :(得分:0)

最简单的方法是从您的PivotData cte中删除ID

WITH PivotData AS
(
select -- remove this field [T_Spec_Char].[ID],
    format([T_Sample].[TimeStamp], 'dd/MM/yyyy') as DT,
    format([T_Sample].[TimeStamp], 'hh:mm:ss') as TM,
    [T_Spec_Char].[Spec_Char],
    [T_Spec].[Line],
    cast([T_Sample].[Value] as float) as Val
from [ABC].[dbo].[T_Spec_Char], [ABC].[dbo].[T_Sample], [ABC].[dbo].[T_Spec] 
where [T_Sample].[Spec_Char_ID] = [T_Spec_Char].[ID] and 
    ([T_Spec_Char].[Spec_Char] = 'Zone1Temp' or [T_Spec_Char].[Spec_Char] = 'Zone2Temp' 
    or [T_Spec_Char].[Spec_Char] = 'Zone3Temp') 
    and [T_Sample].[Spec_ID] = [T_Spec].[ID]
group by [T_Spec_Char].[ID], [T_Sample].[TimeStamp], [T_Spec_Char].[Spec_Char], 
    [T_Spec].[Line], [T_Sample].[Value]
)

SELECT
    DT,
    TM,
    [Line],
    Zone1Temp, 
    Zone2Temp, 
    Zone3Temp
FROM PivotData
PIVOT
(
    SUM(Val)
    FOR Spec_Char
    IN (Zone1Temp, Zone2Temp, Zone3Temp)
) AS PivotResult
ORDER BY DT, TM

答案 2 :(得分:0)

从CTE中删除ID。除了聚合和“PIVOT列”之外,GROUP BY基本上是“FOR所有列。”对ID进行分组会使行保持独立。

WITH PivotData AS
(
select format([T_Sample].[TimeStamp], 'dd/MM/yyyy') as DT,
    format([T_Sample].[TimeStamp], 'hh:mm:ss') as TM,
    [T_Spec_Char].[Spec_Char],
    [T_Spec].[Line],
    cast([T_Sample].[Value] as float) as Val
from [ABC].[dbo].[T_Spec_Char], [ABC].[dbo].[T_Sample], [ABC].[dbo].[T_Spec] 
where [T_Sample].[Spec_Char_ID] = [T_Spec_Char].[ID] and 
    ([T_Spec_Char].[Spec_Char] = 'Zone1Temp' or [T_Spec_Char].[Spec_Char] = 'Zone2Temp' 
    or [T_Spec_Char].[Spec_Char] = 'Zone3Temp') 
    and [T_Sample].[Spec_ID] = [T_Spec].[ID]
group by [T_Spec_Char].[ID], [T_Sample].[TimeStamp], [T_Spec_Char].[Spec_Char], 
    [T_Spec].[Line], [T_Sample].[Value]
)

SELECT
    DT,
    TM,
    [Line],
    Zone1Temp, 
    Zone2Temp, 
    Zone3Temp
FROM PivotData
PIVOT
(
    SUM(Val)
    FOR Spec_Char
    IN (Zone1Temp, Zone2Temp, Zone3Temp)
) AS PivotResult
ORDER BY DT, TM