每天创建 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,您可以在其中保留所有每天的总和并在它们发生变化时进行调整。
我有一个 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,您可以在其中保留所有每天的总和并在它们发生变化时进行调整。