Агрегирование SQL-запросов по месяцам - PullRequest
3 голосов
/ 10 августа 2011

У меня есть база данных транзакций (Access 2007), которые записываются с почасовой, дневной и месячной периодичностью. Я хотел бы рассмотреть их осмысленно (вместо того, чтобы использовать почасовое энергопотребление, как оно хранится, я хочу, чтобы все использовалось в январе 2011 года) Таблицы, с которыми я хочу работать, имеют следующий общий формат:

CustID|CustomerCode|TransactionDate|(Transaction Hour depending on table)|Usage

Итак, если я хочу взять такой стол и создать вид, похожий на этот

BillingPeriod|Usage(mWh)
1/2011     |500
2/2011     |600
3/2011     |700
etc

Как бы я поступил так? Даты транзакции могут быть любой датой, а часы транзакции могут быть 1-24. Сам запрос не кажется таким сложным, что-то вроде:

SELECT TransactionDate, SUM(Usage)
FROM UsageTable
Where (TransactionDate Between [Some Start Date] AND[Some End Date])
GROUP BY TransactionDate;

Проблема с форматированием. Я, очевидно, не могу сгруппировать по транзакции по дате для моих желаемых результатов, я просто написал это, чтобы запрос был семантически правильным. Может быть, я мог бы сделать что-то вроде

SELECT Mid(TransactionDate,0,2) + Mid(TransactionDate, 6, 4)?

Любая помощь будет оценена

Ответы [ 5 ]

4 голосов
/ 10 августа 2011

Кажется, вам нужно сгруппировать по месяцам и годам. В противном случае у вас будет январь 2010 года и январь 2011 года вместе:

SELECT YEAR(TransactionDate), MONTH(TransactionDate), SUM(Usage)
FROM YourTable
WHERE (TransactionDate Between [Some Start Date] AND[Some End Date])
GROUP BY YEAR(TransactionDate), MONTH(TransactionDate)
ORDER BY YEAR(Created), MONTH(Created)

Я не знаю, есть ли в вашей версии SQL функции MONTH и YEAR, поэтому вам, возможно, придется использовать DATEPART.

2 голосов
/ 10 августа 2011

Чтобы избежать преобразования в строки, объединения и преобразования обратно в даты, используйте DATEADD () и DATEDIFF ().

SELECT
  DATEADD("m", DATEDIFF("m", 0, TransactionDate), 0) AS TransactionMonth,
  SUM(Usage)                                         AS TotalUsage
FROM
  yourTable
WHERE
  TransactionDate BETWEEN <startDate> AND <endDate>
GROUP BY
  DATEADD("m", DATEDIFF("m", 0, TransactionDate), 0)
ORDER BY
  DATEADD("m", DATEDIFF("m", 0, TransactionDate), 0)
1 голос
/ 10 августа 2011

Я обычно использую Format([TransactionDate], "yyyy-mm"), потому что он простой и хорошо сортируется.
В качестве другого варианта вы можете использовать [TransactionDate]-Day([TransactionDate])+1, который будет перемещать каждую дату на первое число месяца.Преимущество состоит в том, что вы все еще можете легко форматировать их любым удобным для вас способом или группировать их по кварталу или году.

1 голос
/ 10 августа 2011
SELECT MONTH(TransactionDate),YEAR(TransactionDate), SUM(Usage) 
FROM UsageTable 
Where (TransactionDate Between [Some Start Date] AND[Some End Date]) 
GROUP BY MONTH(TransactionDate),YEAR(TransactionDate);
0 голосов
/ 10 августа 2011

что-то вроде ...

SELECT Month(UsageTable.TransactionDate) & '/' & Year(UsageTable.TransactionDate) AS BillingPeriod, Sum(UsageTable.Usage) AS Usage
FROM UsageTable
WHERE (((UsageTable.TransactionDate) Between [Some Start Date] And [Some End Date]))
GROUP BY Month(UsageTable.TransactionDate) & '/' & Year(UsageTable.TransactionDate);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...