【问题标题】:Can't fetch needed data from database using FoxPro无法使用 FoxPro 从数据库中获取所需数据
【发布时间】:2020-04-14 17:56:46
【问题描述】:

我的老师让我使用 FoxPro 从数据库中选择一些信息。

我需要得到1月份date_exec月份的code_car、car_info和rout_dist的总和,其中1月份的rout_dist总和不大于2月份的rout_dist总和,并按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

数据库结构:

【问题讨论】:

  • 这里需要添加一些代码。你不能指望我们在没有更多上下文的情况下找出问题所在。
  • 添加我的尝试之一
  • 在您展示的示例中,您的两个子查询都获取一月份的信息。此外,您完全适合所有一月,而不仅仅是特定年份的一月。您需要在条件中包含年份。

标签: sql visual-foxpro


【解决方案1】:

由于您似乎仍然没有完整的答案,因此您对 WHERE 子查询有一个好主意,但让我们一次取一个。您需要查询 1 月和 2 月的数据,但要查询当前年份,而不是所有年份。我们可以在一次查询中为每辆车获取此信息,但对您来说是一个小技巧,但随着他们了解更多查询,这在许多其他人中都很常见。

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(),这是确认月份,并且仅在有问题的月份时才对金额求和,并在 1 月和 2 月之间进行区分。 Where 子句明确在 2020 年 1 月 1 日/之后获取任何内容,并且少于 2020 年 3 月 1 日。所以您知道您只会获得 1 月/2 月的记录。

现在,关于 VFP SQL-Select 的一个警告。它实际上运行一次查询以获取结果的最终结构的记录,然后再次运行以实际填充结果查询。如果 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 中的查询之一,就好像它也是一张实际的桌子。

【讨论】:

  • 我尝试修改您的代码并添加输出,即 2 月的 dist 更多,我可以删除这些行吗? (首选子查询)SELECT cm.code_car, cl.info_car,; IIF(sum( iif( month( cm.Date_Exec ) = 1, cm.rout_dist, 0.0 )) &gt; sum( iif( month( cm.Date_Exec ) = 2, cm.rout_dist, 0.0 )), str(sum( iif( month( cm.Date_Exec ) = 2, cm.rout_dist, 0.0 ))), 'sum in january is greater'); FROM car_move cm INNER JOIN car_list cl ON cm.code_car = cl.code_car; GROUP BY cm.code_car; 当我尝试在 FROM foxpro 中使用子查询时也会引发错误。
猜你喜欢
  • 2020-02-08
  • 1970-01-01
  • 2017-09-21
  • 2018-11-24
  • 2018-05-28
  • 2012-01-06
  • 2021-10-25
相关资源
最近更新 更多