Sql server 根据列的值将行放入不同列的透视查询
有些设备由不同的人进行不同类型的检查。我的表中有DeviceID、InspectID、Date和PersosnID用于这些信息。每个设备都可以进行多种类型的检查,因此该设备的表中将有多行Sql server 根据列的值将行放入不同列的透视查询,sql-server,select,pivot-table,Sql Server,Select,Pivot Table,有些设备由不同的人进行不同类型的检查。我的表中有DeviceID、InspectID、Date和PersosnID用于这些信息。每个设备都可以进行多种类型的检查,因此该设备的表中将有多行 DeviceID InspectID Date PersonID 1 10 1/1/2014 100 1 20
DeviceID InspectID Date PersonID
1 10 1/1/2014 100
1 20 2/2/2014 200
2 10 3/3/2014 300
2 30 4/4/2014 400
我正在寻找pivot查询,它创建一个表视图,其中每个设备只有一行,所有类型的检查都显示在列中。假设我事先知道InspectID只有10、20和30
DeviceID Date10 PersonID10 Date20 PersonID20 Date30 PersonID30
1 1/1/2014 100 2/2/2014 200 NULL NULL
2 3/3/2014 300 NULL NULL 4/4/2014 400
我认为这可以通过pivot查询完成,但我对pivots非常陌生。任何帮助都将不胜感激
;WITH CTE1 AS
(
SELECT DeviceID,'Date'+CAST(InspectID AS VARCHAR(5)) InspectID,[DATE],
'Person'+ CAST(InspectID AS VARCHAR(5)) PersonId,PersonId PERSONNO
FROM YourTable WHERE DeviceID=1
UNION ALL
SELECT DeviceID,'Date'+CAST(InspectID AS VARCHAR(5)) InspectID,[DATE],
'Person'+ CAST(InspectID AS VARCHAR(5)),PersonId PERSONNO
FROM YourTable WHERE DeviceID=2
)
SELECT DeviceID,
MIN(CASE WHEN InspectID ='Date10' THEN [DATE] END) Date10,
MIN(CASE WHEN PersonId ='Person10' THEN PERSONNO END) PersonId10,
MIN(CASE WHEN InspectID ='Date20' THEN [DATE] END) Date20,
MIN(CASE WHEN PersonId ='Person20' THEN PERSONNO END) PersonId20,
MIN(CASE WHEN InspectID ='Date30' THEN [DATE] END) Date30,
MIN(CASE WHEN PersonId ='Person30' THEN PERSONNO END) PersonId30
FROM CTE1
GROUP BY DeviceID
这是小提琴
从表中创建临时表
现在是InspectId的透视图
现在,以PersonId为轴心,加入上一个版本中的DeviceId
数据透视表
现在你有了结果,但是你必须对它应用一些其他的逻辑
对列进行排序(因为列是动态的)。你能做到
前端也采用(4,1)、(5,2)、(6,3)等列
但如果我有10万台设备,你建议联合10万次呢???!!!我已经回答了你的问题。联合不反映设备的数量,但影响日期。在这里,您需要为动态日期执行此操作。以下查询将对您有所帮助
SELECT * INTO #TTT FROM
(
SELECT DeviceID,'Date'+CAST(InspectID AS VARCHAR(5)) InspectID,[DATE],
'Person'+ CAST(InspectID AS VARCHAR(5)) PersonId,PersonId PERSONNO
FROM #YourTable WHERE DeviceID=1
UNION ALL
SELECT DeviceID,'Date'+CAST(InspectID AS VARCHAR(5)) InspectID,[DATE],
'Person'+ CAST(InspectID AS VARCHAR(5)),PersonId PERSONNO
FROM #YourTable WHERE DeviceID=2
)TAB
DECLARE @colsL NVARCHAR (MAX)
SELECT @colsL = COALESCE (@colsL + ',[' + CAST(INSPECTID AS VARCHAR) + ']', '[' + CAST(INSPECTID AS VARCHAR) + ']')
FROM #TTT
group by INSPECTID
ORDER BY INSPECTID
DECLARE @FQuery NVARCHAR(MAX)
SET @FQuery = '
select * INTO NEW from
(
select DEVICEID,INSPECTID,[DATE] from #TTT
) as p
PIVOT
(
MIN([DATE]) FOR INSPECTID IN ('+@colsL+')
) AS PT
'
EXECUTE sp_executesql @FQuery
DECLARE @colsL2 NVARCHAR (MAX)
SELECT @colsL2 = COALESCE (@colsL2 + ',[' + CAST(PERSONID AS VARCHAR) + ']', '[' + CAST(PERSONID AS VARCHAR) + ']')
FROM #TTT
group by PERSONID
ORDER BY PERSONID
DECLARE @FQuery2 NVARCHAR(MAX) --@colsL get the INSPECTID columns
SET @FQuery2 = '
select PT.*,'+@colsL+'
FROM
(
select DEVICEID,PERSONID,PERSONNO from #TTT
) as p
PIVOT
(
MIN(PERSONNO) FOR PERSONID IN ('+@colsL2+')
) AS PT
JOIN
(
SELECT * FROM NEW
)AS N
ON PT.DEVICEID=N.DEVICEID
'
EXECUTE sp_executesql @FQuery2