【问题标题】:sql query to show average of each tag present in proficy historiansql查询显示proficy historian中每个标签的平均值
【发布时间】:2014-08-29 10:13:20
【问题描述】:

我需要开发 ssrs 报告,其中用户将提供一个月为 varchar(2) 和年份为 varchar(4)。当用户单击查看报告按钮时,ssrs 报告应显示如下结果。 (假设用户通过月份为 12,年份为 2013)

Date                 TagName               Average
12/01/13             Tag01                   45.23
12/01/13             Tag02                   89.23
12/02/13             Tag01                   2.363
12/02/13             Tag02                   45.23
.
.
.
12/31/13             Tag01                   55.24
12/31/13             Tag02                   95.24

我设计了以下查询

CREATE TABLE #tempval 
  ( 
     [timestamp] VARCHAR(30), 
     tagname     VARCHAR(300), 
     tagval      DECIMAL(18, 5) 
  ) 

DECLARE @month VARCHAR(2) 
DECLARE @year VARCHAR(4) 

SET @month='08' 
SET @year='2014' 

DECLARE @startdate VARCHAR(30) 
DECLARE @enddate VARCHAR(30) 

SET @startdate=@month + '/01/' + @year 

IF ( CONVERT(INT, @month) >= Month(Getdate()) 
     AND CONVERT(INT, @year) >= Year(Getdate()) ) 
  BEGIN 
      SET @enddate=CONVERT(VARCHAR, (SELECT Getdate())) 
  END 
ELSE 
  BEGIN 
      SET @enddate=CONVERT(VARCHAR, Dateadd(day, -1, Dateadd(month, 1, CONVERT( 
                                                     DATETIME, @startdate 
                                                          )) 
                                    )) 
  END 

DECLARE @query VARCHAR(1000) 
DECLARE @starttime VARCHAR(30) 
DECLARE @endtime VARCHAR(30) 

SET @starttime= CONVERT(VARCHAR, Datepart(month, Dateadd(hour, 22, Dateadd(day, 
                -1, CONVERT( 
                DATETIME, @startdate))))) 
                + '/' 
                + CONVERT(VARCHAR, Datepart(day, Dateadd(hour, 22, Dateadd(day, 
                -1, CONVERT(DATETIME, @startdate))))) 
                + '/' 
                + CONVERT(VARCHAR, Datepart(year, Dateadd(hour, 22, Dateadd(day, 
                -1, CONVERT(DATETIME, @startdate))))) 
                + ' ' 
                + CONVERT(VARCHAR, Datepart(hour, Dateadd(hour, 22, Dateadd(day, 
                -1, CONVERT(DATETIME, @startdate))))) 
                + ':' 
                + CONVERT(VARCHAR, Datepart(minute, Dateadd(hour, 22, Dateadd( 
                day, -1, CONVERT(DATETIME, @startdate))))) 
                + ':' 
                + CONVERT(VARCHAR, Datepart(second, Dateadd(hour, 22, Dateadd( 
                day, -1, CONVERT(DATETIME, @startdate))))) 
SET @endtime=CONVERT(VARCHAR, Datepart(month, Dateadd(hour, 22, CONVERT(DATETIME 
             , @startdate) 
             ))) 
             + '/' 
             + CONVERT(VARCHAR, Datepart(day, Dateadd(hour, 22, CONVERT(DATETIME 
             , @startdate)))) 
             + '/' 
             + CONVERT(VARCHAR, Datepart(year, Dateadd(hour, 22, CONVERT( 
             DATETIME, @startdate)))) 
             + ' ' 
             + CONVERT(VARCHAR, Datepart(hour, Dateadd(hour, 22, CONVERT( 
             DATETIME, @startdate)))) 
             + ':' 
             + CONVERT(VARCHAR, Datepart(minute, Dateadd(hour, 22, CONVERT( 
             DATETIME, @startdate)))) 
             + ':' 
             + CONVERT(VARCHAR, Datepart(second, Dateadd(hour, 22, CONVERT( 
             DATETIME, @startdate)))) 
SET @query='select * from openquery(muri,''set StartTime=''''' 
           + @starttime + ''''',EndTime=''''' + @endtime 
           + 
''''' select * from ihrawdata where tagname=MURISERVER.MURI.DCS.ASSETS.87A.87A_FI_2101.DACA.PV  and samplingmode=rawbytime'')'

EXEC (@query) 

但它显示空白列,但我不知道为什么。

【问题讨论】:

  • @query 的输出是什么?
  • 您的选择语句似乎完全错误。如何在 select 语句中编写“set StartTime = '''”。
  • 此查询仅适用于 2014 年 8 月 28 日的单曲。历史学家中有很多标签。它显示该标签的空白列。
  • 你能告诉我@query 的输出吗?我认为您的选择声明是完全错误的。你能帮我打印@query的输出吗
  • 我已经为它拍摄了图像文件,但我不知道如何在这个论坛上发布它。

标签: sql sql-server tsql historian


【解决方案1】:

我发现查询 GE Proficy Historian 的 SSRS 报告最简单的方法是在存储过程中使用动态 SQL。

前提条件是您拥有使用 IhOLEDB.iHistorian 提供程序配置的 SQL Server 链接服务器。安装后看起来像这样:

然后你像往常一样创建一个存储过程,我通常有一个相当通用的过程,它接受你想要查询 GE Historian 的大部分参数。存储过程定义示例:

CREATE PROCEDURE [utility].[Historian_GetData] @DateFrom DATETIME,
                                           @DateTo DATETIME,
                                           @TagList  VARCHAR(1000),
                                           @Historian NVARCHAR(100),
                                           @SampleInterval NVARCHAR(50),
                                           @SampleMethod NVARCHAR(50),
                                           @DefaultRowCount INT = 5000

但是为了保持示例简单,这里是一个匿名块,其中包含一些将用于查询的日期。本质上,对于存储过程中的每个参数,您都可以将它们添加到动态 SQL 中。

DECLARE @DateFrom NVARCHAR(100) = '2018-05-02 06:00'
DECLARE @DateTo   NVARCHAR(100) = '2018-05-03 06:00'

DECLARE @SQL NVARCHAR(4000)
DECLARE @Result TABLE (TagName NVARCHAR(100) NOT NULL, [Timestamp] DATETIME NOT NULL, Value NVARCHAR(100) NOT NULL, Quality NVARCHAR(100) NOT NULL)

BEGIN
   SET @SQL = 'SELECT tagname, timestamp, value, quality
           FROM OPENQUERY ([Your-Historian],
           ''SET StartTime = "' + @DateFrom + '", EndTime = "' + @DateTo + '",
             SamplingMode = RawByTime
             SELECT tagname, timestamp, value, quality
             FROM ihRawData
             WHERE TagName = XYZ'')';

  INSERT INTO @Result EXEC sp_executesql @SQL

  SELECT TagName,
         [Timestamp],
         [Value],
         Quality
  FROM @Result ORDER BY TagName, [Timestamp]
END

结果将如下所示:

总之:

  1. 将链接服务器配置为指向 Historian
  2. 创建您的存储过程,接受所有 Historian 查询参数作为参数。
  3. 执行动态 SQL
  4. 根据需要计算您的结果,根据您的情况计算一些平均值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多