Не удается получить необходимые данные из базы данных с помощью FoxPro - PullRequest
0 голосов
/ 14 апреля 2020

Мой учитель попросил меня выбрать некоторую информацию из базы данных с помощью FoxPro.

Мне нужно получить code_car, car_info и сумму rout_dist с датой date_exe c января, где сумма rout_dist в январе не превышает сумму rout_dist в феврале, и group это по code_car.

Мне нужно что-то вроде этого:

SELECT cm.code_car, info_car, SUM(rout_dist)
    FROM car_move cm
    INNER JOIN car_list cl
        ON cm.code_car = cl.code_car
    WHERE 
        (SELECT SUM(rout_dist)
            FROM car_move cm
            INNER JOIN car_list cl
                ON cm.code_car = cl.code_car
            WHERE MONTH(date_exec) = 1) >
        (SELECT SUM(rout_dist)
            FROM car_move cm
            INNER JOIN car_list cl
                ON cm.code_car = cl.code_car
            WHERE MONTH(date_exec) = 1)
    GROUP BY cm.code_car

Структура базы данных:

this is a database structure

1 Ответ

0 голосов
/ 25 апреля 2020

Поскольку кажется, что у вас все еще нет полного ответа, у вас есть хорошая идея по подзапросам WHERE, но давайте по одному фрагменту за раз. Вы хотите запросы за январь против февраля, но за текущий год, а не за все годы. Мы можем получить это для каждого автомобиля в одном запросе с небольшой хитростью для вас, но часто встречаются во многих других, так как они узнают больше запросов.

select
      cm.code_car,
      sum( iif( month( cm.Date_Exec ) = 1, cm.rout_dist, 00000 )) as JanTotal,
      sum( iif( month( cm.Date_Exec ) = 2, cm.rout_dist, 00000 )) as FebTotal
   from
      car_move cm
   where
          cm.Date_Exec >= date(2020,1,1)
      AND cm.Date_Exec < date(2020,3,1)
   group by
      cm.code_car

(я знаю, что в VFP напрямую вам нужно использовать точку с запятой после каждой строки или это ошибка для вас) Итак, насколько я знаю, вы знаете о IIF (), это подтверждает месяц и суммирует только сумму, если это месяц, о котором идет речь, и различие между январем и февралем. Предложение Where явно получает что-либо 1 января 2020 года и позже, чем МЕНЬШЕ, чем 1 марта 2020 года. Таким образом, вы знаете, что получите только записи за январь / февраль.

Теперь, одно предупреждение на VFP SQL - Выбрать. Фактически он запускает запрос один раз, чтобы получить запись для окончательной структуры результатов, а затем запускается снова, чтобы фактически заполнить запрос результата. Если размер rout_dist больше 5 цифр, просто разверните его, чтобы убедиться, что значения не усечены.

Сначала посмотрите на результаты вышеупомянутого ...

Это также предварительно группирует по code_car все в одном. Итак, теперь, когда вы подтвердите, что результаты функциональности только суммирования в порядке, теперь мы можем перейти к следующему шагу, исключить некоторые записи и получить сведения об оставшихся автомобилях. Приведенный выше запрос становится источником записей «FROM», ему присваивается псевдоним «PreQuery», и он предназначен только для контекста, поскольку внутренний запрос выполнен, а результаты возвращены перед внешним запросом, поэтому я присвоил ему псевдоним «PreQuery».

select
      PreQuery.Code_Car,
      cl.info_car,
      PreQuery.JanTotal
   from
      ( select
              cm.code_car,
              sum( iif( month( cm.Date_Exec ) = 1, cm.rout_dist, 00000 )) as JanTotal,
              sum( iif( month( cm.Date_Exec ) = 2, cm.rout_dist, 00000 )) as FebTotal
           from
              car_move cm
           where
                  cm.Date_Exec >= date(2020,1,1)
              AND cm.Date_Exec < date(2020,3,1)
           group by
              cm.code_car ) PreQuery
         JOIN Car_List cl
            on PreQuery.Code_Car = cl.Code_Car
   where
      PreQuery.JanTotal < PreQuery.FebTotal

Существует много других приемов, особенно в отношении очень сложных запросов, где вы можете разбить их на более мелкие разделы с помощью запроса INTO CURSOR, который создает временную таблицу, которая затем может быть одним из запросов, следующих в другом SQL как будто это тоже фактическая таблица.

...