Конференция "Прочее" » Получить отчет по подтверждению [D7, ACCESS]
 
  • Alex_C (30.11.11 16:05) [0]
    В таблице есть записи содержащие данные по стране и по тому, каким способом подтвеждена (или не подтверждена данная страна) и каким образом подтверждена - бумага, электронным путем и т.п. Мне нужно получить итоговый отчет который бы содержал список всех стран + второе поле - подтвержнеие (причем не важно каким образом) или не подтверждение. Поля подтверждения - булевые. Есть ли возможность создать такой запрос? Если делать так

    SELECT DISTINCT Country, CfmPaper, CfmElec...


    количество записей для одной страны получается несколько. А мне нужно чтоб только одна была.
  • Омлет © (30.11.11 16:09) [1]
    GROUP BY
  • Sergey13 © (30.11.11 16:34) [2]
    > [0] Alex_C   (30.11.11 16:05)
    > и каким образом подтверждена - бумага, электронным путем и т.п.

    > CfmPaper, CfmElec...

    на каждое "и т.п." по полю? Может быть много подтверждений?
    Если только одно подтверждение - прямо тут ссылку на СПРАВОЧНИК видов подтверждений. Если много - в отдельную таблицу эти ссылки вынести.
  • Anatoly Podgoretsky © (30.11.11 17:11) [3]
    > Alex_C  (30.11.2011 16:05:00)  [0]

    Если есть колонки Страна и QSL то какая сложность.
    Так одна и будет, если правильно напишешь запрос
  • Anatoly Podgoretsky © (30.11.11 17:18) [4]
    > Anatoly Podgoretsky  (30.11.2011 17:11:03)  [3]

    Да и вопрос лучше задавать на форумк по твое СУБД, на не ДМ
  • OW © (30.11.11 17:32) [5]
    см

    > GROUP BY


    а проще если для понимая, то
    SELECT DISTINCT Country, (CfmPaper or CfmElec or ...) as QQQ
  • OW © (30.11.11 17:40) [6]
    а правильно -  [2] :)
  • Компромисс (30.11.11 17:48) [7]
    Если записей по каждой стране много, то непонятно, что должно быть в результате. Например, для одной страны могут быть и подтвержденные, и неподвержденные записи. И что тогда должно быть в рез-те?
  • Anatoly Podgoretsky © (30.11.11 20:55) [8]
    SELECT Country, Count(*) where ... GROUP BY Country ORDER BY ...
  • Anatoly Podgoretsky © (30.11.11 20:55) [9]
    Нечто подобное
  • Alex_C (30.11.11 20:59) [10]

    >  Например, для одной страны могут быть и подтвержденные,
    >  и неподвержденные записи. И что тогда должно быть в рез-
    > те?


    В результате должны остаться:
    1. Если страна подтверждена - то только запись о том, что страна подтверждена.
    2. Если не подтвеждена - запись что такая страна есть, но она не подтвеждена.
    В результате сделал так - не знаю на сколько верно, но работать стало очень быстро.
    Сначала запрос:

       CommandText := 'SELECT Country, BandADIF, Mode, SUM(' + S + ') AS QSL ' +
        'FROM ' + LogName + ' WHERE Country <> ' + QuotedStr('') +
        'GROUP BY Country, BandADIF, Mode ORDER BY Country ';
       Active := True;



    SUM(' + S + ') - вставляся нужные пользователю подтверждения - только бумага и/или еще какие. В результате запрос изначально один. А затем:


    function GetCountryStatus(Call, Band, Mode: string): integer;
    type
     TCfmWkd = (cwNone, cwWkd, cwCfm);
    var
     BandFind, ModeFind: TCfmWkd;
     CountryData: TCountryData;
    begin
     Result := COUNTRY_ERROR; // Такой страны нет

     // Проверяем позывной на правильность
     if (not CheckTrueCall(Call)) or
       (not ValidADIFBand(Band)) or
       (not ValidMode(Mode)) then
       Exit;

     CountryData := FindCall(Call);
     if CountryData.MainPref = '' then
       Exit;

     Result := COUNTRY_NOT_NEED;
     BandFind := cwNone;
     ModeFind := cwNone;

     if FLogDataSet.Locate('Country', CountryData.MainPref, []) then
     begin
       while (not FLogDataSet.Eof) and
         (FLogDataSet.FieldByName('Country').AsString = CountryData.MainPref) do
       begin
         if (BandFind <> cwCfm) and
           (FLogDataSet.FieldByName('BandADIF').AsString = Band) then
         begin
           if FLogDataSet.FieldByName('QSL').AsInteger < 0 then
             BandFind := cwCfm;
           if BandFind <> cwCfm then
             BandFind := cwWkd;
         end;
         if (ModeFind <> cwCfm) and
           (FLogDataSet.FieldByName('Mode').AsString = Mode) then
         begin
           if FLogDataSet.FieldByName('QSL').AsInteger < 0 then
             ModeFind := cwCfm;
           if ModeFind <> cwCfm then
             ModeFind := cwWkd;
         end;
         if (BandFind = cwCfm) and (ModeFind = cwCfm) then
           Break
         else
           FLogDataSet.Next;
       end;

       case BandFind of
         cwNone: Result := Result or COUNTRY_NEW_BAND;
         cwWkd : Result := Result or COUNTRY_NOT_CFM_BAND;
       end;
       case ModeFind of
         cwNone: Result := Result or COUNTRY_NEW_MODE;
         cwWkd : Result := Result or COUNTRY_NOT_CFM_MODE;
       end;
     end
     else
       Result := COUNTRY_NEW;
    end;



    Получилось что работает на несколько порядков быстрее, чем для каждой страны свой запрос делать.
 
Конференция "Прочее" » Получить отчет по подтверждению [D7, ACCESS]
Есть новые Нет новых   [134431   +11][b:0][p:0.002]