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
merci, j'ai mis en place quelque chose de très similaire à cela. – slicedtoad