多重计数(不同)

时间:2012-02-27 19:48:39

标签: sql tsql count distinct visual-foxpro

除非我删除其中一个count(distinct ...),否则会收到错误消息。有人可以告诉我为什么以及如何解决它? 我在vfp。 iif([condition],[if true],[else])相当于case when

SELECT * FROM dpgift where !nocalc AND rectype = "G" AND sol = "EM112" INTO CURSOR cGift
    SELECT
        list_code,
        count(distinct iif(language != 'F' AND renew = '0'  AND type =  'IN',donor,0)) as d_Count_E_New_Indiv,
        count(distinct iif(language = 'F' AND renew = '0'   AND type =  'IN',donor,0)) as d_Count_F_New_Indiv /*it works if i remove this*/
    FROM cGift gift
        LEFT JOIN
                (select didnumb, language, type from dp) d
            on cast(gift.donor as i) = cast(d.didnumb as i)
    GROUP BY list_code
    ORDER by list_code

编辑: 显然,你不能在同一级别上使用多个不同的命令。有什么方法吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用另一个或两个派生表来进行所需的计算,或使用投影(字段列表中的查询)。没有看到架构,很难知道哪一个适合你。

答案 1 :(得分:1)

VFP在同一个查询中不支持两个“DISTINCT”子句... PERIOD ...我甚至在VFP中直接测试了我自己的一个简单表格,如

select count( distinct Col1 ) as Cnt1, count( distinct col2 ) as Cnt2 from MyTable

导致崩溃。我不知道你为什么要尝试做DISTINCT,因为你只是测试一个条件...我更准确地说你只想要每个标准类别的COUNT个条目而不是实际上DISTINCT

因为您不是“alias.field”引用查询中的列,所以我不知道哪个列是什么的基础。但是,为了帮助处理你的DISTINCT,当你使用“INTO CURSOR”子句(它不会与任何OleDB .net开发相关联)时,看起来你正在从WITHIN VFP应用程序运行,我会预先查询和分组那些标准,比如......

select list_code,
       donor,
       max( iif( language != 'F' and renew = '0' and type = 'IN', 1, 0 )) as EQualified,
       max( iif( language  = 'F' and renew = '0' and type = 'IN', 1, 0 )) as FQualified
   from
      list_code
   group by
      list_code,
      donor
   into 
      cursor cGroupedByDonor

因此,无论有多少记录符合条件,上述每个列表代码只能获得1个计数器。另外,如果一个记录为“F”而另一个记录为NOT,则每列中的值为1 ......那么你可以做类似的事情......

select
      list_code,
      sum( EQualified ) as DistEQualified,
      sum( FQualified ) as DistFQualified
   from
      cGroupedByDonor
   group by
      list_code
   into
      cursor cDistinctByListCode

然后从那里开始......