按月汇总SQL查询分组

时间:2011-08-10 13:32:49

标签: sql ms-access

我有一个交易数据库(Access 2007),每小时,每天和每月记录一次。我希望以有意义的方式查看它们(而不是按小时计算能量,这是它的存储方式,我希望2011年1月份的所有使用情况)。我想要操作的表格具有以下通用格式:

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;

问题在于格式化。我显然不能通过transactiondate对我想要的结果进行分组,我只是写了它,所以查询在语义上是正确的。也许我可以做类似

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

任何帮助将不胜感激

5 个答案:

答案 0 :(得分:4)

您似乎需要按月份和年份进行分组。否则,您将在2010年1月和2011年1月合并:

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。

答案 1 :(得分:2)

为了避免转换为字符串,连接和转换回日期,请使用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)

答案 2 :(得分:1)

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);

答案 3 :(得分:1)

我通常使用Format([TransactionDate], "yyyy-mm"),因为它很简单并且排序很好 作为另一种选择,您可以使用[TransactionDate]-Day([TransactionDate])+1,这会将每个日期移至其当月的第一天。优点是你仍然可以轻松地以任何你想要的方式格式化,或者之后按季度或年份进行分组。

答案 4 :(得分:0)

类似......

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);