除非我删除其中一个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
编辑: 显然,你不能在同一级别上使用多个不同的命令。有什么方法吗?
答案 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
然后从那里开始......