每天创建 sql 到 return 个结果

create sql to return results per day

我有一个 SQL,它给我一个 table,其中包含当月结果的总和。

SELECT VAR1
    ,VA2
    ,SUM(VAR3)
    ,SUM(VAR4)
FROM TABLE1
LEFT JOIN TABLE2
    ON TABLE1.VAR1 = TABLE2.VAR1
WHERE TABLE1.DATE >= '06/01/2017'
    AND TABLE1.DATE <= 'TODAY'
GROUP BY 1
    ,2
ORDER BY 2

但是我需要 return 一个 table 它给我每天的结果。

如何用SQL构造。也许使用 While ?

感谢对此事的任何帮助

谢谢

将您的日期字段转换为日期以消除任何时间部分(如果需要)并将其添加到 select(这样您就知道是哪一天)并分组依据(因此总和是按天计算的) ).

SELECT VAR1
     , VA2
     , SUM(VAR3)
     , SUM(VAR4)
     , Cast(TABLE1.DATE as date)
FROM TABLE1
LEFT JOIN TABLE2
  ON TABLE1.VAR1 = TABLE2.VAR1
WHERE TABLE1.DATE >= '06/01/2017'
  AND TABLE1.DATE <= 'TODAY'
GROUP BY VAR1
       , VAR2
       , Cast(TABLE1.DATE as date)
ORDER BY VAR2

此外,通常认为在组 by/order 中使用列位置是不好的做法,因此我更新为适当的列名称。

看来日期可能是reserved word;所以如果它真的是列名,你可能需要用双引号将它转义,更改名称:但请注意,如果你必须使用双引号,列名将区分大小写。如果还不算太晚,最好将其称为 Event_Date、Start_date、End_date 比数据类型更具描述性的东西。

最后,您的月份总和仅基于您所做的 >= 月初的事实。如果今天变成 8/1 那么你有多个月。您真的只需要当前月份的数据吗?

蟒蛇!

添加 Firebird 特性,您可以使用 EXTRACT 函数。

https://www.firebirdsql.org/refdocs/langrefupd21-intfunc-extract.html

SELECT 
  ....
GROUP BY
  Extract( YEAR FROM TABLE1.DATE ), Extract( YEARDAY FROM TABLE1.DATE ),
  VAR1, VAR2

但是请注意,这往往会自然扫描所有 table,然后对所有选定的原始数据进行外部排序。

它可能会消耗大量磁盘吞吐量、磁盘 space 和 CPU 时间。

如果您确实必须经常执行此类查询,那么您最好创建特殊的聚合 - 累积 table,您可以在其中保留所有每天的总和并在它们发生变化时进行调整。