SQL server 2016合并数据透视表中的行
我在SQL Server 2016中使用以下查询创建了一个透视表SQL server 2016合并数据透视表中的行,sql,sql-server,pivot-table,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
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行)合并到一行中
@诺克斯龙。您的查询将产生以下结果:
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
未测试,但您应该使用类似的方法对这些行进行分组:
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
最简单的方法是从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
从CTE中删除ID。PIVOT本质上是由除aggregate和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
请不要使用图像显示您的数据或查询结果。STLDeveloper,将图像更改为上面的列表,谢谢。。。。。请从隐式连接语法逗号分隔从句切换到显式列出连接及其条件。这使得WHERE子句应该主要用于初始FROM子句中的表的主筛选时,更清楚地知道哪些项属于哪些表,仅此而已。如果您按SELECT中的每一列进行分组,您的意思确实是不同的,尽管通常最好找出重复项的来源并停止该操作。此外,您是否可以使用所有列的where表引用更新查询?“我怀疑您可以减少pivot中使用的表的数量,但如果不知道这些列来自何处,就很难说出来。”Clockwork Muse table references补充道。你能举个例子说明你的意思,从隐式连接切换到显式连接和条件吗?