2011-10-18 39 views
1

我正在使用Pentaho CDE开发一个仪表板。我创建了一个查询来从数据库中获取组织名称。 以下查询完美的作品对我来说:需要使用Pentaho CDE创建参数化查询的帮助

select top 5 
employer_name,count(emp_id) as emp_count 
from employment_details 
where employer_name=${employer} 
group by employer_name 
order by emp_count desc 

我想改变where子句,这样,而不是使用=,我想用like条款。所以我修改查询如下:

select top 5 
employer_name,count(emp_id) as emp_count 
from employment_details 
where employer_name like ${employer} 
group by employer_name 
order by emp_count desc 

但它没有给我适当的结果。例如,如果${employer}的值为IBM,那么查询将返回具有与IBM完全相同的employer_name的行。

我试过将where子句改为where employer_name like '%${employer}%',但它不起作用。

编辑1

按照由PDPI的建议,我试图用双引号代替单引号周围$ {}雇主,但现在我得到Parent exception: Invalid parameter index 1.例外。以下是堆栈跟踪的一部分:

pt.webdetails.cda.dataaccess.QueryException: Found an unhandled exception: 
     at pt.webdetails.cda.dataaccess.SimpleDataAccess.queryDataSource(SimpleDataAccess.java:299) 
     at pt.webdetails.cda.dataaccess.AbstractDataAccess.doQuery(AbstractDataAccess.java:312) 
     at pt.webdetails.cda.CdaEngine.doQuery(CdaEngine.java:51) 
     at pt.webdetails.cda.CdaContentGenerator.doQuery(CdaContentGenerator.java:299) 
     at pt.webdetails.cda.CdaContentGenerator.createContent(CdaContentGenerator.java:139) 
     at org.pentaho.platform.web.servlet.GenericServlet.doGet(GenericServlet.java:261) 
     at org.pentaho.platform.web.servlet.GenericServlet.doPost(GenericServlet.java:80) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.j 
    ava:290) 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
      at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:861) 
      at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProto 
    col.java:579) 
      at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1584) 
      at java.lang.Thread.run(Thread.java:619) 
    Caused by: pt.webdetails.cda.dataaccess.QueryException: ReportDataFactoryException : Failed at query 
    : select top 5 
    emp.employer_name,count(emp.rinx_id) as candidate_count 
    from tbl_cand_employment_details emp 
    where emp.employer_name like "%${employer}%" 
    group by emp.employer_name 
    order by candidate_count desc; Parent exception: Invalid parameter index 1. 
      at pt.webdetails.cda.dataaccess.PREDataAccess.performRawQuery(PREDataAccess.java:116) 
      at pt.webdetails.cda.dataaccess.SimpleDataAccess.queryDataSource(SimpleDataAccess.java:288) 
      ... 68 more 

请帮我组成这个查询。

EDIT 2

我的问题是现在解决了。感谢Pentaho论坛上的this问题。

我修改我的where子句如下,现在它的工作:

where employer_name like '%' + ${employer} + '%' 
+1

嘿那里, 您使用的是CDA查询还是Legacy? 如果您想在employer_name中的任何地方匹配雇主,您绝对应该使用“%$ {雇主}%”。这个变体怎么不起作用?没有结果,相同的结果?如果你没有得到任何结果,你能看看萤火虫的网络面板,并检查是否有任何请求失败,或查询是否只是没有返回。 (免责声明:我是CDE首席开发人员) – pdpi

+0

@pdpi,非常感谢您的建议。我会尝试使用双引号而不是单引号并返回。希望它能起作用。 – Shekhar

+0

@pdpi,我可以从哪里获得有关CDE查询参数的更多信息?其实我无法找到Pentaho社区版的适当文档或教程。很少有书,但这些书是指企业版。 – Shekhar

回答

1

正如PDPI所说,您应该使用“%$ {employer}%”,即双引号不是单引号。那么它应该工作。

+0

是的,但他特别说没有,这很奇怪。 – pdpi

+0

@Codek,非常感谢您的建议。我会尝试使用双引号而不是单引号并返回。希望它能起作用。 – Shekhar

1

我解决了使用CDF和行动序列文件类似的问题。在我看来,你正试图在Javascript中参数化查询。在这种情况下,组件对象具有参数字段,该字段接受一组参数。像这样使用;

parameters : [ [ "REGION", "region" ], [ "DISTRICT", "district" ], 
       [ "SUB_DISTRICT", "subDistrict" ] ] 

另外,还有一个监听器字段,用于在参数更改时刷新组件。有关更多详细信息,请参阅Pentaho解决方案中的CDF参考。