【问题标题】:Converting SQL statement to SQL expression field in Crystal Reports在 Crystal Reports 中将 SQL 语句转换为 SQL 表达式字段
【发布时间】:2013-01-31 21:14:14
【问题描述】:

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

【问题讨论】:

  • 您是否尝试过将您的 sql 查询作为命令添加到水晶报表中? sql 查询返回的max([meter_reading]) 将被视为数据库中的字段。

标签: sql crystal-reports crystal-reports-2008


【解决方案1】:

您的第一步应该是阅读 SQL 表达式在 Crystal 中的工作原理。 Here is a good link to get you started.

您的一些问题包括:

  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

【讨论】:

    【解决方案2】:

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

    命令有两个选项:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多