繁体   English   中英

Coldfusion计数案例错误取决于数据源

[英]coldfusion count case error depending on datasource

我正在使用Coldfusion使用COUNT CASE语句从数据库中检索一些值。

下面的SQL与SQL Server数据源完美地兼容:

<cfquery name="getData" datasource="cfTSP1_Dev">
  SELECT  SiteFK,
      Scheme,
      COUNT(case when DrawingTypeFK = 'Civil' then 1 else null end) as CCount,
      COUNT(case when DrawingTypeFK = 'Mechanical' then 1 else null end) as MCount,
      COUNT(case when DrawingTypeFK = 'Electrical' then 1 else null end) as ECount,
      COUNT(case when DrawingTypeFK = 'P & ID' then 1 else null end) as PCount,
      COUNT(case when DrawingTypeFK = 'Zoning' then 1 else null end) as ZCount
  FROM     Drawings.tblDrawingsData
  where     SiteFK = 'MYSITE'
  group by  SiteFK,Scheme
  order by Scheme

但是当我更改查询以指向访问数据库中完全相同的表时,会收到错误消息:

<cfquery name="getData" datasource="drawingsLink">
  SELECT  SiteFK,
      Scheme,
      COUNT(case when DrawingTypeFK = 'Civil' then 1 else null end) as CCount,
      COUNT(case when DrawingTypeFK = 'Mechanical' then 1 else null end) as MCount,
      COUNT(case when DrawingTypeFK = 'Electrical' then 1 else null end) as ECount,
      COUNT(case when DrawingTypeFK = 'P & ID' then 1 else null end) as PCount,
      COUNT(case when DrawingTypeFK = 'Zoning' then 1 else null end) as ZCount
  FROM     tblDrawingsData
  where     SiteFK = 'MYSITE'
  group by  SiteFK,Scheme
  order by Scheme

错误是这样的:

[Macromedia] [SequeLink JDBC驱动程序] [ODBC套接字] [Microsoft] [ODBC Microsoft Access驱动程序]语法错误(缺少运算符)在查询表达式“ COUNT(在DrawingTypeFK ='Civil'时为1,否则为null结束)。

有什么想法吗? 我唯一的理论是它的访问驱动程序,但我使用此数据源的其他查询(无Count Case)都很好。

干杯尼尔

Access的数据库引擎不支持CASE ... WHEN ,因此您需要重写查询。 您可以在Access SQL中使用IIf()近似CASE ... WHEN

SELECT  SiteFK,
  Scheme,
  Count(IIf(DrawingTypeFK = 'Civil', 1, null)) as CCount

Count()仅计算非Null值,因此应该给您我认为想要的东西。 但是,如果要使用Sum() ,如注释中所建议,这也应该起作用:

Sum(IIf(DrawingTypeFK = 'Civil', 1, 0)) as CCount

我尚未测试此代码,并且我想它的效率将比您的代码低得多,但它应可在MS Access中使用。 如果您的代码可以在所需的任何地方工作,那么我认为它比下面的代码更好。

SELECT
        SiteFK,
        Scheme,
        (
            SELECT  count(*)
            FROM    Drawings.tblDrawingsData Civil
            WHERE   Civil.Scheme = tblDrawingsData.Scheme
                AND Civil.DrawingTypeFK = 'Civil'
        ) AS CCount,
        (
            SELECT  count(*)
            FROM    Drawings.tblDrawingsData Civil
            WHERE   Civil.Scheme = tblDrawingsData.Scheme
                AND Civil.DrawingTypeFK = 'Mechanical'
        ) AS MCount,
        (
            SELECT  count(*)
            FROM    Drawings.tblDrawingsData Civil
            WHERE   Civil.Scheme = tblDrawingsData.Scheme
                AND Civil.DrawingTypeFK = 'Electrical'
        ) AS ECount,
        (
            SELECT  count(*)
            FROM    Drawings.tblDrawingsData Civil
            WHERE   Civil.Scheme = tblDrawingsData.Scheme
                AND Civil.DrawingTypeFK = 'P & ID'
        ) AS PCount,
        (
            SELECT  count(*)
            FROM    Drawings.tblDrawingsData Civil
            WHERE   Civil.Scheme = tblDrawingsData.Scheme
                AND Civil.DrawingTypeFK = 'Zoning'
        ) AS ZCount
  FROM      Drawings.tblDrawingsData
  WHERE     SiteFK = 'MYSITE'
  GROUP BY  SiteFK, Scheme
  ORDER BY  Scheme

这是一个相关的子查询,因此它可能非常慢。 买家当心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM