множественный счет (отличный) - PullRequest
0 голосов
/ 27 февраля 2012

Я получаю сообщение об ошибке, если не удалю один из 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 ]

1 голос
/ 28 февраля 2012

VFP НЕ поддерживает два предложения "DISTINCT" в одном запросе ... ПЕРИОД ... Я даже тестировал на своей собственной простой таблице, ПРЯМО изнутри VFP, такой как

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

вызывает сбой.Я не знаю, почему вы пытаетесь выполнить DISTINCT, поскольку вы просто тестируете условие ... Точнее, вам кажется, что вы просто хотите СЧЕТЧИК записей для каждой категории критериев вместо DISTINCT

, потому что выне являются "alias.field" ссылками на ваши столбцы в запросе, я не знаю, какой столбец является основой чего.Однако, чтобы помочь вам справиться с DISTINCT, вы, похоже, запускаете приложение WITHIN в VFP, когда используете предложение «INTO CURSOR» (которое не связано с какой-либо разработкой OleDB .net), я бы предварительно запросил и сгруппировалэти критерии, что-то вроде ...

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», а другая - НЕ, то вы будете иметь значение 1 в КАЖДОМ из столбцов ... Тогда вы можете сделать что-то вроде ...

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

тогда беги от этого ...

1 голос
/ 28 февраля 2012

Вы можете попробовать использовать другую производную таблицу или две, чтобы выполнить необходимые вычисления, или использовать проекции (запросы в списке полей).Не видя схемы, трудно понять, какая из них подойдет вам.

...