在Crystal Reports转换SQL语句SQL表达式场(Converting SQL stat

2019-10-17 16:09发布

我有一个拉动的数据,我需要一个SQL语句,但我不能得到正确的语法在Crystal Reports。

此语句工作在SQL:

SELECT
    max([meter_reading])
FROM [Forefront].[dbo].[EC_METER_HISTORY_MC]
WHERE [Meter_Number] = '1' AND [Transaction_Date] < '20130101'
GROUP BY 
    [Company_Code], [Equipment_Code], [Meter_Number]

这就是我把它改为水晶,但我不能得到正确的语法。

SELECT     
   Maximum({EC_METER_HISTORY_MC.meter_reading}) 
FROM [EC_METER_HISTORY_MC] 
WHERE {EC_METER_HISTORY_MC.Meter_Number} = '1' 
AND {EC_METER_HISTORY_MC.Transaction_Date}  <  {1?Startdate}
GROUP BY {EC_METER_HISTORY_MC.Company_Code}
,{EC_METER_HISTORY_MC.Equipment_Code}
,{EC_METER_HISTORY_MC.Meter_Number}

Answer 1:

你的第一步应该是对SQL表达式的水晶是如何工作的阅读起来。 这里是让你开始一个很好的链接 。

一些您的问题包括:

  1. 使用参数字段。 SQL表达式是不与CR参数不兼容,无法在其中使用。
  2. SQL表达式只能按您的报告行返回标量值。 这意味着,你GROUP BY的使用不会起任何作用。
  3. 您使用大括号的意思是你引用在主报表查询 ,而不是在你想用这个表达式创建子查询这些字段。

下面是会找到一个特定仪表的最大抄表一个简单的例子(对于Oracle,因为这是我所知道的和你没有指定DB你使用):

case when {EC_METER_HISTORY_MC.Meter_Number} is null then null
else (select max(Meter_Reading)
      from EC_METER_HISTORY_MC
      where Meter_Number={EC_METER_HISTORY_MC.Meter_Number} --filter by the meter number from main query
       and Transaction_Date < Current_Date) --filter by some date. CAN'T use parameter here.
end


Answer 2:

你不能在一个SQL表达式中使用参数字段,可悲。 也许你能够关联Transaction_Date在主查询表。 否则,我会建议使用的命令。

您有命令两个选项:

  1. 使用单个命令对象为整个报告数据源 - 它涉及(潜在)返工相当数量。
  2. 一个命令添加到现有的表集(在数据库“专家”)。 根据需要将其链接到其它表。 这将进行第二次SELECT ,并在内存中加入的结果(WhileReadingRecords,如果我没有记错的话)。 轻微的性能损失可能值得我们的利益。


文章来源: Converting SQL statement to SQL expression field in Crystal Reports