首页 > 解决方案 > 使用 PIVOT 在 SQL Server 中将列转换为行

问题描述

我知道,这个问题并不新鲜,我在这里阅读了很多示例,但找不到我的任务的解决方案:

我主要有两个表,按 1:n 关联。这TestPlan_Measure_Modules_Sensors是表中传感器通道和通道本身的集合Machine_TestResults_Values

每个频道的数量都不同TestPlan_Measure_Modules_Sensors

以下是定义:

Machine_TestResults_Sensors

Machine_TestResults_Values

id_TestPlan_Measure_Module_Sensors链接到传感器定义。

假设“Drehzahl”传感器有两个值,查询结果如下表:

SELECT        
    TestPlan_Measure_Module_Sensors.SensorName, LineNumber, Value
FROM
    Machine_TestResults_Sensors 
LEFT JOIN
    Machine_TestResults_Values ON Machine_TestResults_Sensors.id = Machine_TestResults_Values.id_Machine_TestResults_Sensors 
LEFT JOIN
    TestPlan_Measure_Module_Sensors ON Machine_TestResults_Sensors.id_TestPlan_Measure_Module_Sensors = TestPlan_Measure_Module_Sensors.id 
WHERE 
    id_Machine_Measure_Modules = 253

在此处输入图像描述

现在我需要切换行和列以获得这样的输出:

在此处输入图像描述

我假设我需要动态 SQL 来实现基于可变列数和适当的 Pivot 语句的结果。但是 SQL Server 中的 Pivot 并不是我真正的强项,所以我希望这里有人能帮助我。

更新:谢谢提示,我尝试了SQL Server 动态 PIVOT 查询的解决方案?

我的示例,调整为上述链接中的解决方案,结果如下表:

在此处输入图像描述

知道如何摆脱第一个“NULL”行吗?

更新:我DELETE在查询中添加了一条语句,现在看起来应该这样。

这是我的查询版本:

DECLARE @cols AS NVARCHAR(MAX);
DECLARE  @query  AS NVARCHAR(MAX);


SELECT        
    TestPlan_Measure_Module_Sensors.SensorName, LineNumber, Value
FROM
    Machine_TestResults_Sensors 
LEFT JOIN
    Machine_TestResults_Values ON Machine_TestResults_Sensors.id = Machine_TestResults_Values.id_Machine_TestResults_Sensors 
LEFT JOIN
    TestPlan_Measure_Module_Sensors ON Machine_TestResults_Sensors.id_TestPlan_Measure_Module_Sensors = TestPlan_Measure_Module_Sensors.id 
WHERE 
    id_Machine_Measure_Modules = 253

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.SensorName) 
        FROM #temp c
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @query = 'SELECT LineNumber, ' + @cols + ' INTO #pt from 
        (
            select LineNumber,
                    [Value],
                    SensorName
            from #temp
       ) x
        pivot 
        (
             max([Value])
            for SensorName in (' + @cols + ')
        ) p; DELETE FROM #pt WHERE LineNumber IS NULL; SELECT * FROM #pt;'

Execute(@query);

DROP TABLE #temp

标签: sql-serverpivot

解决方案


推荐阅读