Я использую SQL в vfp, поэтому некоторые мои команды отличаются.iif([condition],[if true],[if false])
используется вместо case when
.
вот мой код:
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
Что этот код должен сделать, это найти, сколько доноров пожертвовали в каждой категории подарков.Он не должен подсчитывать дублирующихся доноров в одном и том же поле (т. Е. Тот же список_кодов / языков / обновлять / и т. Д.), Но должен подсчитывать доноров дважды, если это другое поле.
Пример: донора № 3 можно посчитать толькоодин раз в d_Count_E_New_Indiv, но также может учитываться в d_Count_E_New_Org.
gidnumb является первичным ключом в этой таблице.
С моим вторым соединением я прикрепил поле (названное уникальным) к первому донору вТаблица.Это не работает, потому что он считает донора только в одном поле.
Может кто-нибудь сказать мне, как это правильно сделать?Кроме того, у меня есть намного больше СУММ (...), которые не основаны на уникальных донорах, поэтому я бы предпочел не разделывать мой выбор слишком сильно.
РЕДАКТИРОВАТЬ: я исправил это с помощью следующего select count(distinct IIF(renew = '0' AND lang != 'F',donor,0)) FROM dpgift