创建sql以每天返回结果

时间:2017-06-20 12:43:20

标签: sql firebird

我有一个SQL,它为我提供了一个表,其中包含当前月结果的总和。

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

但是我需要返回一张表格,它会给我一天一天的结果。

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

感谢对此事的任何帮助

由于

2 个答案:

答案 0 :(得分:2)

将您的日期字段转换为日期以消除任何时间部分(如果需要)并将其添加到选择(因此您知道哪一天是哪个)并分组(因此总和是按天)。

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

通常认为通过/ order使用组中的列位置通常是不好的做法,因此我更新了相应的列名。

看起来日期可能是reserved word;因此,如果它确实是列名,您可能需要使用双引号对其进行转义,更改名称:但请注意,如果必须使用双引号,则列名称将区分大小写。如果不是太晚,最好将其称为Event_Date,Start_date,End_date,而不仅仅是数据类型。

最后,您的月总和仅基于您正在执行的事实&gt; =月初。如果今天变成8/1那么你有多个月。你真的只需要当前数月的数据吗?

Boa sorte!

答案 1 :(得分:0)

添加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

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

它可能会占用大量磁盘吞吐量,磁盘空间和CPU时间。

如果你真的必须经常进行这样的查询,那么你最好创建一个特殊的聚合 - 累积表,你可以保留所有的每日总和,并在它们发生变化时进行调整。