在Crystal Reports中将SQL语句转换为SQL表达式字段

在Crystal Reports中将SQL语句转换为SQL表达式字段,sql,crystal-reports,crystal-reports-2008,Sql,Crystal Reports,Crystal Reports 2008,我有一个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

我有一个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]
这是我在crystal中将其更改为的内容,但我无法获得正确的语法

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}

您的第一步应该是了解SQL表达式在Crystal中是如何工作的

您的一些问题包括:

使用参数字段。SQL表达式与CR不兼容 参数,并且不能在其中使用。 SQL表达式只能在报表的每行返回标量值。这意味着你的 使用GROUP BY没有任何作用。 使用大括号意味着在主报表查询中引用这些字段,而不是在试图使用此表达式创建的子查询中引用这些字段。 下面是一个简化的示例,可以找到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

遗憾的是,您不能在SQL表达式中使用参数字段。也许您可以将事务日期与主查询中的表相关联。否则,我建议使用命令

该命令有两个选项:

使用单个命令对象作为整个报告的数据源,这可能涉及大量的返工。 向数据库“Expert”中的现有表集添加命令。根据需要将其链接到其他表。如果我没弄错的话,这将在读取记录时执行第二次选择并将结果加入内存。轻微的性能打击可能使我们值得受益。
您是否尝试将sql查询作为命令添加到crystal report中?sql查询返回的最大[meter_reading]将被视为数据库中的字段。