Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 根据列的值将行放入不同列的透视查询_Sql Server_Select_Pivot Table - Fatal编程技术网

Sql server 根据列的值将行放入不同列的透视查询

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和PersosnID用于这些信息。每个设备都可以进行多种类型的检查,因此该设备的表中将有多行

    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