use*_*994 0 mysql datetime aggregate time-series
我需要在一周内显示GP总和的两个计算列,在前一个列中显示另一列
我认为我的方式是正确的,但我错过了一些东西
我想让我的结果像这样::
| WEEK |日本|澳大利亚| GB |
| PREV | 22 | 32 | 23 |
| CUR | 12 | 15 | 12 |
我的sql是这个我相信我可能需要透视数据
SELECT
(SUM(`GP`), `gptw`)
FROM
(SELECT
`GP`,
`Country`
FROM
`Finance`
WHERE DATE >= CURDATE() - INTERVAL DAYOFWEEK(CURDATE()) + 6 DAY
AND DATE < CURDATE() - INTERVAL DAYOFWEEK(CURDATE()) - 1 DAY
GROUP BY `Country`) AS lastweeek
INNER JOIN
(SELECT
SUM(`GP`) AS `gptw`,
`Country`
FROM
Finance
WHERE DATEDIFF(NOW(), `date`) < 4
GROUP BY `Country`) AS `thisweek`
Run Code Online (Sandbox Code Playgroud)
Nitpick: DATE列名的选择很差,因为它是一个保留的SQL字.
这里有四个逻辑层次.
首先,您需要有工作逻辑来确定每天的哪一周.
其次,您需要选择正确的DATE值范围.
第三,你需要GROUP BY正确的逻辑.
第四,您需要将结果集透视以使本周和上周进入同一行.这种旋转应该成为另一个问题的主题.
首先,此表达式将任何DATETIME值转换为前一个星期日.
FROM_DAYS(TO_DAYS(value) -MOD(TO_DAYS(value) -1, 7))
Run Code Online (Sandbox Code Playgroud)
第二,这是你需要选择两周(上周和本周)
WHERE `DATE` >= FROM_DAYS(TO_DAYS(NOW()) -MOD(TO_DAYS(NOW()) -1, 7)) - INTERVAL 7 DAY
AND `DATE` < FROM_DAYS(TO_DAYS(NOW()) -MOD(TO_DAYS(NOW()) -1, 7)) + INTERVAL 7 DAY
Run Code Online (Sandbox Code Playgroud)
这将获得从上周日之前的星期日开始的日期范围,并结束本星期日之后的星期日之前的那一天,即两周的范围.
第三,你需要正确分组.在您的架构中,按周和按国家/地区分组.它会是这样的:
SELECT SUM(`GP`) AS GP,
`Country`,
FROM_DAYS(TO_DAYS(`DATE`) -MOD(`DATE`) -1, 7)) AS week_beginning
FROM `Finance`
WHERE `DATE` >= FROM_DAYS(TO_DAYS(NOW()) -MOD(TO_DAYS(NOW()) -1, 7)) - INTERVAL 7 DAY
AND `DATE` < FROM_DAYS(TO_DAYS(NOW()) -MOD(TO_DAYS(NOW()) -1, 7)) + INTERVAL 7 DAY
GROUP BY `Country`, FROM_DAYS(TO_DAYS(`DATE`) -MOD(`DATE`) -1, 7))
ORDER BY `Country`, FROM_DAYS(TO_DAYS(`DATE`) -MOD(`DATE`) -1, 7))
Run Code Online (Sandbox Code Playgroud)
这将为每个国家/地区提供两行,一行用于一周前的week_beginning,一行用于当前周.这可以帮到你.如果没有,您可以转动此查询的结果,以按您希望的方式排列行.那应该是另一个问题的主题.
最后,如果您可以在MySQL实例中定义存储函数,则应定义函数TRUNC_SUNDAY.然后你可以像这样更容易地编写你的查询:
SELECT SUM(`GP`) AS GP,
`Country`,
TRUNC_SUNDAY(`DATE`) AS week_beginning
FROM `Finance`
WHERE `DATE` >= TRUNC_SUNDAY(NOW()) - INTERVAL 7 DAY
AND `DATE` < TRUNC_SUNDAY(NOW()) + INTERVAL 7 DAY
GROUP BY `Country`, TRUNC_SUNDAY(`DATE`)
ORDER BY `Country`, TRUNC_SUNDAY(`DATE`)
Run Code Online (Sandbox Code Playgroud)
这是用于定义所需存储的TRUNC_SUNDAY函数的SQL代码:
DELIMITER $$
DROP FUNCTION IF EXISTS `TRUNC_SUNDAY`$$
CREATE FUNCTION `TRUNC_SUNDAY`(datestamp DATETIME)
RETURNS DATE
NO SQL
DETERMINISTIC
COMMENT 'returns preceding Sunday'
RETURN FROM_DAYS(TO_DAYS(datestamp) -MOD(TO_DAYS(datestamp) -1, 7))$$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
您可以在此处找到此技术的详细说明,包括TRUNC_MONDAY函数.如果您的工作日定义为星期一而不是星期日,则需要TRUNC_MONDAY功能. http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/
| 归档时间: |
|
| 查看次数: |
3258 次 |
| 最近记录: |