需要帮助使用Pentaho CDE创建参数化查询

时间:2011-10-18 07:31:40

标签: dashboard pentaho

我正在使用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,那么查询将返回具有employee_name的行与IBM完全相同的行。

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

  

编辑1

根据pdpi的建议,我试图在$ {employer}周围使用双引号而不是单引号,但现在我得到Parent exception: Invalid parameter index 1.例外。以下是stacktrace的一部分:

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

请帮我构建此查询。

  

编辑2

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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