我有一个SQL表,用于存储从自动化过程记录的过程数据。该表存储变量名称,记录值,时间戳。该表如下所示:
VariableName | VariableValue | Timestamp
------------------------------------------
Tag_1 | 1 | Time_1
Tag_1 | 5 | Time_2
Tag_1 | 4 | Time_5
Tag_1 | 8 | Time_7
Tag_2 | 3 | Time_1
Tag_2 | 4 | Time_3
Tag_2 | 5 | Time_6
Tag_2 | 7 | Time_7
...
记录变量的值"在变化",因此它们出现在具有不同时间戳的表中。
为了能够导出数据并将其用于进一步处理,我们需要对表格进行排序并以不同的形式表示,即:
Timestamp | Tag_1 | Tag_2
--------------------------
Time_1 | 1 | 3
Time_2 | 5 | -
Time_3 | - | 4
Time_5 | 4 | -
Time_6 | - | 5
Time_7 | 8 | 7
正如你所看到的,有一些"盲点"在表示变量值的表中,这对应于仅在此时没有记录标记值的事实,即标记值相对于先前记录的值没有变化。
如何使用SQL实现此目的?我很可能需要一个具有上述结构的新表。但是,它需要动态创建,因为列数取决于记录的变量数(Tag_1,Tag_2等)。
创建表并查询数据库不是问题,因为我为此目的使用VB脚本。但是,我不知道如何制定查询(连接???)来实现该结构...
答案 0 :(得分:3)
Yo可以使用此pivot查询:
TimeStamp | Tag_1 | Tag_2
----------+-------+-------
Time_1 | 1 | 3
Time_2 | 5 | (null)
Time_3 |(null) | 4
Time_5 | 4 | (null)
Time_6 |(null) | 5
Time_7 | 8 | 7
看到它在rextester.com上运行。输出:
//Javascript
window.onload = function() {
document.getElementById("sidebar").style.visibility = "hidden";
};
您不能直接使用动态列列表来执行此操作,但在编程环境中(或在带有execute
的TSQL中),您可以动态构建此查询。
答案 1 :(得分:1)
将dynamic sql与pivot一起使用。
首先计算列名的@Columns变量。
LogTable用于获取标签名称。但是如果你有一个带有已知标签的参考表,那么最好将它建立在那个参考表上。由于日志表往往变大。
DECLARE @Columns VARCHAR(max);
DECLARE @SQL VARCHAR(max);
SELECT @Columns = concat(@Columns+', ',QUOTENAME(VariableName)) FROM LogTable GROUP BY VariableName;
SET @SQL = 'SELECT *
FROM (SELECT VariableName, VariableValue, [Timestamp] FROM LogTable) q
PIVOT (MAX(VariableValue) FOR VariableName IN ('+ @Columns +')) p';
EXEC (@SQL);
答案 2 :(得分:0)