1

我有一个 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}
4

2 回答 2

2

您的第一步应该是阅读 SQL 表达式在 Crystal 中的工作方式。这是一个很好的链接,可以帮助您入门

您的一些问题包括:

  1. 使用参数字段。SQL 表达式与 CR 参数不兼容,不能在其中使用。
  2. SQL 表达式只能为报表的每行返回标量值。这意味着您对 GROUP BY 的使用没有任何用途。
  3. 您使用花括号意味着您在主报表查询中引用这些字段,而不是在您尝试使用此表达式创建的子查询中。

这是一个简化的示例,可以找到特定仪表的最大仪表读数(对于 Oracle,因为这是我所知道的,您没有指定您正在使用哪个数据库):

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
于 2013-01-30T19:30:44.910 回答
1

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

命令有两个选项:

  1. 使用单个 Command 对象作为整个报告的数据源——这涉及(可能)大量的返工。
  2. 将命令添加到现有表集(在数据库“专家”中)。根据需要将其链接到其他表。这将执行一秒钟SELECT并将结果加入内存中(WhileReadingRecords,如果我没记错的话)。轻微的性能损失可能值得我们受益。
于 2013-01-31T13:14:14.920 回答