Выберите count (), когда поле уникально - PullRequest
0 голосов
/ 27 февраля 2012

Я использую 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

Ответы [ 2 ]

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

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

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

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

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

Я думаю, что вы можете обойтись без COUNT (отличный донор) AS total_gifts, у меня нет Visual Fox Pro, я немного погуглил, и это упоминается.

...