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

时间:2013-01-30 17:03:56

标签: 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], [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}

2 个答案:

答案 0 :(得分:2)

您的第一步应该是阅读SQL Expressions在Crystal中的工作方式。 Here is a good link to get you started

您的一些问题包括:

  1. 使用参数字段。 SQL表达式与CR不兼容 参数并不能在其中使用。
  2. SQL表达式只能返回报表每行的标量值。那意味着你的 使用GROUP BY不起任何作用。
  3. 您对花括号的使用意味着您在主报表查询中引用了这些字段,而不是在您尝试使用此表达式创建的子查询中。
  4. 这是一个简化的示例,可以找到特定仪表的最大仪表读数(对于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
    

答案 1 :(得分:0)

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

命令有两个选项:

  1. 使用单个Command对象作为整个报告的数据源 - 这可能涉及(可能)相当多的返工。
  2. 将命令添加到现有表集(在数据库'专家'中)。根据需要将其链接到其他表。这将执行第二个SELECT并将结果连接到内存中(WhileReadingRecords,如果我没有记错的话)。轻微的性能打击可能值得我们受益。