我有一个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?
感谢对此事的任何帮助
由于
答案 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时间。
如果你真的必须经常进行这样的查询,那么你最好创建一个特殊的聚合 - 累积表,你可以保留所有的每日总和,并在它们发生变化时进行调整。