2015-11-24 2 views
2

У меня есть таблица в моей базе данных под названием продажи:Включение все даты в дату диапазоны

SaleID (PK) 
Quantity 
Date 
Time 
TotalPrice 
TransactionID (FK) 

Я тогда тестовую таблицу, в одной и той же базе данных со следующей структурой:

SaleID (PK) 
DateFrom 
DateTo 
TotalPrice 
AveragePrice 

В у меня есть 60 000 дат. В моем тестовом столе я хотел бы, чтобы date from и date to были в неделю. Так, например:

DateFrom - 1st January 2016. 
DateTo - 7th January 2016. 
AveragePrice - 20,000 

Это позволило бы мне просмотреть среднюю продажу за неделю. Есть ли способ принять все даты от продажи в 7-дневном диапазоне и вставить их в тест? Я не могу придумать запрос, который бы сделал эту работу. Я знаю, как сделать запрос в течение одной недели:

SELECT * FROM sale where date between 'January 1 2016' and 'January 7 2016' 

Однако я не уверен, как я бы вставить 1 января 2016 как FromDate и 7 января 2016 года, как Todate и сделать это для каждого диапазона 7 дней. Является ли это возможным?

+0

Почему бы просто не использовать функцию weekofyear для возврата 1-53 на основе даты и использовать ее для анализа? (функция зависит от фактической РСУБД, и вы указали mySQL, а также SQL-сервер, чтобы эти функции менялись.) ([datePart] (https://msdn.microsoft.com/en-us/library/ms174420.aspx) SQL server, [weekofYear] (https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_weekofyear) mySQL) – xQbert

+0

mysql или sql-server? –

+0

@xQbert Я не знал об этой функции. Это звучит, как идеальный способ, чтобы идти об этом, хотя. Я использую MySQL. – Someguywhocodes

ответ

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 | 
+0

Когда я запускаю его, год и неделя остаются нулевыми. – Someguywhocodes

+0

Поле «Дата» типа 'DATE' btw не использует это имя для переменных, поскольку зарезервировано lenguaje. Может быть, вам нужны одинарные кавычки? проверить мое обновление –

+0

Я только что проверил структуру, когда данные были сгенерированы, столбец даты - это строка, а не дата. Так что это будет проблемой, я уверен. – Someguywhocodes

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 относится к неделе 1 года 2015 года. Или: 31-12-2015 относится к неделе 53 года 2015 года, но (в нашем случае) до периода 13 (а не 14, в нашем 4- недельный период).

Смежные вопросы