【问题标题】:Problem with the with clause when connecting to the wonderware historian database连接到 Wonderware Historian 数据库时出现 with 子句的问题
【发布时间】:2019-04-16 23:01:47
【问题描述】:

我正在通过自定义 sql 查询连接到 Tableau Desktop 上的 Wonderware Historian 数据库。在查询中使用 with 语句时遇到问题。

SELECT DateTime, Compteur, Valeur
FROM
(
SELECT  DateTime, TagName AS Compteur
,       Value - LAG(Value, 1, NULL) OVER (PARTITION BY TagName ORDER BY 
DateTime) AS Valeur
FROM History 
WHERE  TagName IN 
                (
                 'H270ME01MDB90.vol',
                'H270ME01MDB91.vol',
                'HA44AC01CDI07.vol',
                'HA44AC01CDI06.vol'
                ) 
AND DateTime >='2018-12-31 23:59:00'
AND wwRetrievalMode='Delta'
)t
WHERE t.DateTime >='2018-12-31 23:59:59'

使用此代码,我可以从数据库中获取日期,但我需要操作这些数据并执行以下操作:

WITH t AS 
(
  SELECT DateTime, Compteur, Valeur
  FROM (SELECT  DateTime, TagName AS Compteur
,               Value - LAG(Value, 1, NULL) OVER (PARTITION BY TagName ORDER 
BY DateTime) AS Valeur
        FROM History 
        WHERE TagName IN ('H270ME01MDB90.vol', 'H270ME01MDB91.vol', 
'HA44AC01CDI07.vol', 'HA44AC01CDI06.vol'
                          )  AND
              DateTime >='2018-12-31 23:59:00' AND
              wwRetrievalMode = 'Delta'
       ) k
   WHERE k.DateTime >= '2019-01-01'  
)
SELECT t.*
FROM t
UNION ALL
(SELECT dateadd(hh,datepart(hh,DateTime), cast(CAST(DateTime as date) as 
Datetime)),
    'K' as compteur,
    (SUM(CASE WHEN Compteur IN ('H270ME01MDB90.vol', 'H270ME01MDB91.vol') 
THEN Valeur END) /
     SUM(CASE WHEN Compteur IN ('HA44AC01CDI07.vol', 'HA44AC01CDI06.vol') 
THEN Valeur
         END)
    ) * SUM(CASE WHEN Compteur IN ('HA44AC01CDI06.vol') THEN Valeur END)
 FROM t
 GROUP BY hour
);

它抛出一个错误,并说我应该在 with 语句之前放一个分号。当我添加它时,它说“;”附近的语法不正确。 任何帮助将不胜感激。 谢谢!

编辑: Microsoft SQL error

即使这个简单的 with 语句也行不通。

【问题讨论】:

  • Wnat 是没有; 的确切错误?
  • 这是我在没有分号的情况下得到的错误:关键字“with”附近的语法不正确。如果这个语句是一个公用表表达式、一个 xmlnamespaces 子句或一个更改跟踪上下文子句,则前面的语句必须以分号结束。
  • 你确定这是 MySQL 吗?
  • 我的目标是通过对现有行进行一些计算并将结果添加到表中来获取数据并向数据添加新行(不更改数据库)。
  • 这是 Wonderware Historian 数据库,并通过选择 Microsoft Sql Server 选项使用 Tableau 连接到它。顺便说一句 LAG() 工作正常,所以它应该支持这种事情吧?

标签: sql sql-server tableau-api common-table-expression


【解决方案1】:

我很确定您不能在 Tableau 的自定义 SQL 查询中使用 CTE。 Tableau 只能使用单个 SELECT 语句作为 SQL 数据源。

【讨论】:

  • 是的,这就是文档所说的...kb.tableau.com/articles/howto/using-common-table-expressions。它将它包装在 SELECT TOP 1 * from ( [All your Custom SQL here] ) as [TableauSQL] 因此错误
  • 谢谢克里斯哈克特!这实际上是问题所在。为了克服这个问题,在连接数据库之前,应该编辑“初始 SQL”。所以我在初始 SQL 中编写了相同的代码。将相同的代码放在 Initial SQL... 中是否正确?
  • 看起来您必须更改 2 个部分:1.) 将所有当前代码(CTE 和 select from)放入 INITIAL SQL 框中,但您当前的代码需要插入到您选择的本地临时表名称(即 SELECT t.* INTO #yourtmptable FROM t....) 2.)在您的自定义 SQL 查询中,使用类似“select * from #yourtmptable”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多