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