SQL:使用动态数据透视查询计算列

时间:2019-03-26 10:30:42

标签: sql dynamic subquery pivot calculated-columns

我的数据库中有一个表,其中包含所有传感器的测量值。这些传感器的名称在数据库的另一个表中列出。我想创建一个透视图,将测量的日期时间戳记和传感器名称作为列。我想使用其中一些列来计算新的“变量”。

原始表格:

Id  | DateTime              | SensorId  | Value
100 | 2019-01-01 00:00:00   | 1         | 19
101 | 2019-01-01 00:05:00   | 1         | 19
102 | 2019-01-01 00:10:00   | 1         | 19
109 | 2019-01-01 00:00:00   | 2         | 44,4
110 | 2019-01-01 00:05:00   | 2         | 44,3
111 | 2019-01-01 00:10:00   | 2         | 44,1
118 | 2019-01-01 00:00:00   | 3         | 338
119 | 2019-01-01 00:05:00   | 3         | 335
120 | 2019-01-01 00:10:00   | 3         | 330

我有两段代码,但是我不知道如何“合并”我需要的部分。

首先,我创建了一个简单的数据透视表,其中包含:

DECLARE @cols  AS NVARCHAR(MAX)='';
DECLARE @query AS NVARCHAR(MAX)='';
DECLARE @query2 AS NVARCHAR(MAX)='';

SELECT @cols = @cols + QUOTENAME([SensorId]) + ',' FROM (select distinct [SensorId] from [dbo].[Measurement] ) as tmp
select @cols = substring(@cols, 0, len(@cols)) --trim "," at end

set @query = 
'SELECT [DateTime], [1] , [2], [3], [1] * [2] from 
(
    select [DateTime], [Value], [SensorId] from [dbo].[Measurement]
) src
pivot 
(
    max([Value]) for [SensorId] in (' + @cols + ')
) piv'

execute(@query)

这将创建:

DateTime            | 1     | 2     | 3     | Calculated column
2019-01-01 00:00:00 | 19    | 44,4  | 338   | 843,6
2019-01-01 00:05:00 | 19    | 44,3  | 335   | 841,7
2019-01-01 00:10:00 | 19    | 44,1  | 330   | 837,9

但是在此表中,列已编号(而不是命名),我需要知道我有多少个传感器。

通过此查询,我还设法获得了带有传感器名称的数据透视表:

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(Unicode)
  FROM (SELECT  distinct dbo.Unicode.Code as Unicode
FROM     dbo.Measurement INNER JOIN
                  dbo.Sensor ON Sensor.Id = Measurement.SensorId INNER JOIN
                  dbo.SensorModel on SensorModel.Id = Sensor.Id INNER JOIN
                  dbo.Unicode on Unicode.Id = SensorModel.UnicodeId) AS x;
SET @sql = N'
SELECT ' + STUFF(@columns, 1, 2, '') + ' 
FROM
(
  Select dbo.Measurement.DateTime, dbo.Unicode.Code as Unicode, dbo.Measurement.Value as value
FROM     dbo.Measurement INNER JOIN
                  dbo.Sensor ON Sensor.Id = Measurement.SensorId INNER JOIN
                  dbo.SensorModel on SensorModel.Id = Sensor.Id INNER JOIN
                  dbo.Unicode on Unicode.Id = SensorModel.UnicodeId
) AS j
PIVOT
(
  max(value) FOR Unicode IN ('
  + STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
  + ')
) AS p;';

PRINT @sql;
EXEC sp_executesql @sql;

结果:

Temperature1    | Temperature2
44,4            | 338
44,3            | 335
44,1            | 330

但是我不知道如何添加日期时间并计算额外的变量。我知道我想乘哪个传感器名称。因此,我认为这类似于... SELECT [DateTime], ' + STUFF(@columns, 1, 2, '') + ' [Temperature1]*[Temperature2] FROM ...,但这当然不能解决问题。

要清楚,我想要这张桌子:

    DateTime            | Temperature1 | Temperature2 | Calculated column
    2019-01-01 00:00:00 | 19           | 44,4         | 843,6
    2019-01-01 00:05:00 | 19           | 44,3         | 841,7
    2019-01-01 00:10:00 | 19           | 44,1         | 837,9

0 个答案:

没有答案