我有大量的记录,其中一个事务日期时间字段可以追溯到几年前 . 我想在今年和去年的同一时间段内进行比较分析 . 我如何按周分组超过3个月?
我在使用YEARWEEK和WEEK功能时遇到了问题,因为2012年开始的那一天与2011年开始的那天相比 .
鉴于我每天从1月1日到当天都有日期时间的记录,并且记录的日期时间与上一年相同,我如何按周分组,以便输出与日期之和如:01/01 / 2011,01 / 08 / 2011,01 / 15/2011等,以及01/01 / 2012,01 / 08 / 2012,01 / 15/2012等?
我的查询到目前为止如下:
SELECT
DATE_FORMAT(A.transaction_date, '%Y-%m-%d') as date,
ROUND(sum(A.quantity), 3) AS quantity,
ROUND(sum(A.total_amount), 3) AS amount,
A.product_code,
D.fuel_type_code,
D.fuel_type_name,
C.customer_code,
C.customer_name
FROM
cl_transactions AS A
INNER JOIN
card AS B ON A.card_number=B.card_number
INNER JOIN
customer AS C ON B.customer_code=C.customer_code
INNER JOIN
fuel_type AS D ON A.fuel_type=D.fuel_type_code
WHERE
((A.transaction_date >= DATE_FORMAT(NOW() - INTERVAL 3 MONTH, '%Y-%m-01')) OR (A.transaction_date - INTERVAL 1 YEAR >= DATE_FORMAT(NOW() - INTERVAL 15 MONTH, '%Y-%m-01') AND A.transaction_date <= NOW() - INTERVAL 1 YEAR))
GROUP BY
A.transaction_date, fuel_type_code;
我基本上喜欢能够实现以下伪查询的东西:
GROUP BY
STARTING FROM THE OLDEST DATE (A.transaction_date + INTERVAL 6 DAY)
1 回答
我开始使用sqlvariables进行内部查询,以构建今年和每年各年/月/日开始的年份和去年的范围(分别为:2012-01-01和2011-01-01) . 从那时起,我也预先格式化了最终输出的日期,因此你有一个主日期基础显示反映了“今年”周的日期 .
从那时起,我连接到交易表,其中交易日期是当前周的相应开始和下周开始的BETWEEN . 由于日期/时间戳包括小时分钟,因此2012-01-01本身暗示为当天的12:00:00(午夜) . 之间将在7天后的12:00:00之间进行 . 该日期将成为下周的开始日期 .
因此,通过加入EITHER last yr或此yr时间段之间的日期,它具有相同的组资格 . 因此,字段选择每个去年或今年执行ROUND(SUM(IF())) . 如果收到的交易日期少于当前年度的开始日期,那么它必须是上一年的记录,否则是当前年度的记录 . 因此,分别添加值本身,或应用时为零 .
所以现在,你有了这个小组 . 它符合条件的那一周已经通过“ThisYearWeekOf”格式化列从内部查询准备,无论是否有其他计算的“YEARWEEK()”或“WEEK()” . 日期范围负责我们的资格 .
最后,我添加了燃料类型作为连接,并包括作为分组 . 您必须按所有非聚合列对正确的SQL进行分组,尽管MySQL可以通过抓取给定组的第一个条目(如果它未在group by中指定)来实现 .
要关闭,我DID包含客户的信息,因为你没有在组中,并且看起来不适用...它只是任意 grab 一个 . 但是,我已将其添加到组中,因此现在您的记录将显示在每个客户级别,每种产品和燃料类型,今年和去年之间的销售量和数量 .