2012-02-27 4 views
0

J'utilise SQL dans vfp donc certaines de mes commandes sont différentes. iif([condition],[if true],[if false]) est utilisé au lieu de case when.Sélectionnez count() lorsque le champ est unique

voici mon code:

SELECT 
    giftsource, 
    COUNT(donor) AS total_gifts, /*this is not the one that need fixed*/ 
    SUM(amt) AS total_amt, 
    SUM(iif(unique = 1 AND language != 'F' AND renew = '0' AND type = 'IN',1,0)) as d_Count_E_New_Indiv, 
    SUM(iif(unique = 1 AND language = 'F' AND renew = '0' AND type = 'IN',1,0)) as d_Count_F_New_Indiv, 
    SUM(iif(unique = 1 AND language != 'F' AND renew != '0' AND type = 'IN',1,0)) as d_Count_E_Re_Indiv, 
    SUM(iif(unique = 1 AND language = 'F' AND renew != '0' AND type = 'IN',1,0)) as d_Count_F_Re_Indiv, 
    SUM(iif(unique = 1 AND language != 'F' AND renew = '0' AND type != 'IN',1,0)) as d_Count_E_New_Org, 
    SUM(iif(unique = 1 AND language = 'F' AND renew = '0' AND type != 'IN',1,0)) as d_Count_F_New_Org, 
    SUM(iif(unique = 1 AND language != 'F' AND renew != '0' AND type != 'IN',1,0)) as d_Count_E_Re_Org, 
    SUM(iif(unique = 1 AND language = 'F' AND renew != '0' AND type != 'IN',1,0)) as d_Count_F_Re_Org, 
FROM (select *, 
      cast(/* equivalent to a bunch of if elses*/ 
       iif( list_code="WEB","1", 
       iif( list_code="GRO","2", 
       iif( list_code="CHO","3", 
       iif( list_code="TEL","4", 
       iif( list_code="TES","5", 
       iif( list_code="POS" AND amt < 10000,"6", 
       iif((LIKE(list_code,"4%") OR list_code = "4") AND amt < 10000,"7", 
       iif((LIKE(list_code,"4%") OR list_code = "4" OR list_code = "POS") AND amt >= 10000,"8", 
       iif( LIKE(list_code,"9%") OR list_code = "9","9", 
       "10"))))))))) as c(1)) 
      as giftsource 
     from cGift) gift 
    LEFT JOIN 
      (select didnumb, language, type from dp) d 
     on cast(gift.donor as i) = cast(d.didnumb as i) 
    LEFT JOIN /*this does not do what i want it to*/ 
      (select min(gidnumb) gid, 1 as unique from cGift group by donor) uGift 
     on gift.gidnumb = uGift.gid 
GROUP BY giftsource 
ORDER BY giftsource 

Qu'est-ce que ce code devrait faire est de trouver combien de donneurs donnés dans chaque catégorie de cadeaux. Il ne doit pas compter les donneurs en double dans le même champ (c'est-à-dire même list_code/lang/renew/etc.) Mais il doit compter un donneur deux fois s'il s'agit d'un autre champ. Exemple: le donneur n ° 3 ne peut être compté qu'une fois dans d_Count_E_New_Indiv mais peut également être compté dans d_Count_E_New_Org. Gidnumb est la clé primaire de cette table.

Avec ma deuxième jointure j'ai attaché un champ (nommé unique) au premier donneur dans la table. Cela ne fonctionne pas car il ne compte que le donneur dans un domaine. Est-ce que quelqu'un peut me dire quelle est la bonne façon de le faire? Aussi, j'ai beaucoup plus de SOMME (...) qui ne sont pas basées sur des donneurs uniques, donc je préfère ne pas trop maigner.

EDIT: i il fixe en utilisant les éléments suivants select count(distinct IIF(renew = '0' AND lang != 'F',donor,0)) FROM dpgift

Répondre

1

Que diriez-vous à l'aide d'une seule requête que les groupes sur tous les domaines concernés (qui ressemble à giftsource, langue, renouveler et type) pour obtenir un enregistrement pour chaque combinaison avec le nombre dont vous avez besoin:

SELECT giftsource, language, renew, type, COUNT(*) ; 
    FROM <whatever tables and joins you need> ; 
    GROUP BY giftsource, language, renew, type 

Ensuite, Vous pouvez soit joindre ceci à tout ce dont vous avez besoin ou utiliser du code Xbase pour le mettre dans une seule ligne. Vous pouvez également faire un tableau croisé (avec VFPXTab ou l'un des outils tiers) pour faire pivoter les données.

+0

merci, j'ai mis en place quelque chose de très similaire à cela. – slicedtoad

1

Je pense que vous pouvez vous en sortir avec COUNT (donneur distinct) AS total_gifts, je n'ai pas le renard visuel pro et fait quelques googler et il est mentionné.

+0

ouais je peux faire 'select count (donneur distinct)'. Comment pourrais-je mettre cela dans mon code si? J'utilise 'sum (iif (expression, 1,0))' parce que j'ai besoin d'un filtre. – slicedtoad

+0

oh, ce n'est pas total_gifts qui a besoin d'être réparé. C'est toutes les sommes() agissant comme des comptes. – slicedtoad

Questions connexes