我的数据库中有一个名为sale的表:
SaleID (PK)
DateFrom
DateTo
TotalPrice
AveragePrice
然后我在一个具有以下结构的同一个数据库中有一个测试表:
date from
在销售中,表格我有60,000个日期。在我的测试表中,我希望date to
和DateFrom - 1st January 2016.
DateTo - 7th January 2016.
AveragePrice - 20,000
为一周。例如:
SELECT * FROM sale where date between 'January 1 2016' and 'January 7 2016'
这将允许我查看每周的平均销售额。有没有办法在7天范围内拍卖所有日期并将其插入测试?我无法想出一个可以使这个工作的查询。我知道如何进行一周的查询:
{{1}}
但是,我不确定如何将2016年1月1日作为FromDate和2016年1月7日作为ToDate插入,并且每7天执行此操作。有可能吗?
答案 0 :(得分:2)
这个不起作用。 2014年的上周说是第1周
SELECT YEAR(`Date`), WEEKOFYEAR(`Date`), AVG(TotalPrice) FROM Sales GROUP BY YEAR(`Date`), WEEKOFYEAR(`Date`)
January 1 2016
将有一周不到7天
如果你想要7天的周,你可以使用:
<强> SQL Fiddle Demo 强>
SELECT
SUBDATE(`Date`, WEEKDAY(`Date`)) MondayWeek,
AVG(`TotalPrice`)
FROM Sales
GROUP BY SUBDATE(`Date`, WEEKDAY(`Date`))
我包含另一个查询以查看此工作
SELECT `Date`, WEEKDAY(`Date`), YEAR(`Date`), WEEKOFYEAR(`Date`), yearWeek(`Date`)
FROM Sales
order by `Date`;
<强>输出强>
| Date | WEEKDAY(`Date`) | YEAR(`Date`) | WEEKOFYEAR(`Date`) | YEARWEEK(`Date`) |
|------------|-----------------|--------------|--------------------|------------------|
| 2014-12-24 | 2 | 2014 | 52 | 201451 |
| 2014-12-25 | 3 | 2014 | 52 | 201451 |
| 2014-12-26 | 4 | 2014 | 52 | 201451 |
| 2014-12-27 | 5 | 2014 | 52 | 201451 |
| 2014-12-28 | 6 | 2014 | 52 | 201452 |
| 2014-12-29 | 0 | 2014 | <===> 1 | 201452 | ***
| 2014-12-30 | 1 | 2014 | 1 | 201452 |
| 2014-12-31 | 2 | 2014 | 1 | 201452 |
| 2015-01-01 | 3 | 2015 | <===> 1 | 201452 | ***
| 2015-01-02 | 4 | 2015 | 1 | 201452 |
| 2015-01-03 | 5 | 2015 | 1 | 201452 |
| 2015-01-04 | 6 | 2015 | 1 | 201501 | ***
| 2015-01-05 | 0 | 2015 | 2 | 201501 |
| 2015-01-06 | 1 | 2015 | 2 | 201501 |
| 2015-01-07 | 2 | 2015 | 2 | 201501 |
| 2015-01-08 | 3 | 2015 | 2 | 201501 |
| 2015-01-09 | 4 | 2015 | 2 | 201501 |
| 2015-01-10 | 5 | 2015 | 2 | 201501 |
| 2015-01-11 | 6 | 2015 | 2 | 201502 |
| 2015-01-12 | 0 | 2015 | 3 | 201502 |
| 2015-01-13 | 1 | 2015 | 3 | 201502 |
| 2015-01-14 | 2 | 2015 | 3 | 201502 |
| 2015-01-15 | 3 | 2015 | 3 | 201502 |
| 2015-01-16 | 4 | 2015 | 3 | 201502 |
答案 1 :(得分:0)
罗马有很多方法,所以有解决这个问题的方法。 在我看来,最佳方式是引入日历表。
例如:
DateSQL DateText Week Year Month Day Weekday Period YearPeriod MonthPeriod
2014-12-29 29-12-2014 1 2014 12 29 Monday 1 2015 1
2014-12-30 30-12-2014 1 2014 12 30 Tuesday 1 2015 1
2014-12-31 31-12-2014 1 2014 12 31 Wednesday 1 2015 1
2015-01-01 01-01-2015 1 2015 1 1 Thursday 1 2015 1
2015-01-02 02-01-2015 1 2015 1 2 Friday 1 2015 1
2015-01-03 03-01-2015 1 2015 1 3 Saturday 1 2015 1
2015-01-04 04-01-2015 1 2015 1 4 Sunday 1 2015 1
2015-01-05 05-01-2015 2 2015 1 5 Monday 1 2015 1
它可以解决查询中的很多问题,以确定几个日期问题。例如:29-12-2014属于2015年第1周。 或者:2015年12月31日属于2015年第53周,但(在我们的例子中)属于第13期(而不是14周,在我们的4周时间内)。