считать есть условие в foxpro - PullRequest
       4

считать есть условие в foxpro

0 голосов
/ 21 сентября 2010

У меня есть таблица, следующая

id name date
1  a    08/09/2003
2  b    02/03/2003
3  c    10/08/2004
4  c    25/08/2007
5  a    01/01/2008

Я хочу подсчитать базу данных.с таблицей ниже с результатом следуйте:

2003 = 2
2004 = 1
2007 = 0 because c has in 2004-year
2008 = 0 because a has in 2003-year

Ответы [ 3 ]

1 голос
/ 21 сентября 2010

Возможно, я решаю другую проблему, но в этом коде указывается число в каждом году для имен, которые не появлялись в предыдущие годы:

*-- Get the firstyear for each name
Select Name, Min(Year(Date)) As firstyear ;
  From table1;
  Group By Name Into Cursor temp1

*-- Get the year of the date for each entry
Select Id, Name, Year(Date) As yr From table1 Into Cursor temp2

*-- Identify those rows that appear for the first time
Select temp2.*, temp1.firstyear, Iif(temp2.yr = temp1.firstyear, 1, 0) As countme ;
  FROM temp2 INNER Join temp1 ;
  ON temp2.Name = temp1.Name Into Cursor temp3

*-- Add up the "CountMe" fields to get the sum.
Select yr, Sum(countme) From temp3 Group By yr
1 голос
/ 21 сентября 2010

Сначала получите имя и самый ранний год, в котором оно появляется:

select name, min(year(date)) as year from table
group by name into cursor temp

Затем получите счет за этот год:

select count(table.name) 
from table join temp on table.name = temp.name 
and year(table.date) = temp.year
0 голосов
/ 22 сентября 2010

* / Во-первых, получите по каждому имени в первый год, когда у них есть транзакция * / для ... в дополнение к общему количеству транзакций, совершенных этим лицом независимо от * / года. Например: ваши два совпадения "a "и" c "лиц

SELECT ;
        YT.Name,;
        MIN( YEAR( YT.DATE )) as FirstYear,;
        COUNT(*) as TotalPerName;
    FROM ;
        YourTable YT;
    GROUP BY ;
        1;
    INTO ;
        CURSOR C_ByNameTotals

* / Теперь, когда у вас есть итоги на основе первого года на человека с их общими * / записями независимо от года, получите год и сумму итогов, которые ИМЕЮТ* / записи для данного года .... THEN UNION для всех исходных возможностей года * /, которых НЕ было в наборе результатов C_ByNameTotals.(отсюда твой 2007 и 2008)

SELECT;
        FirstYear as FinalYear,;
        SUM( TotalPerName ) as YrCount;
    FROM ;
        C_ByNameTotals;
    GROUP BY ;
        1;
    INTO ;
        CURSOR C_FinalResults;
UNION;
SELECT DISTINCT;
        YEAR( Date ) as FinalYear,;
        0 as YrCount;
    FROM ;
        YourTable ;
    WHERE ;
        YEAR( Date ) NOT IN ;
            ( select FirstYear FROM C_ByNameTotals )
...