在SQL Server中按日期分组
问题描述:
我在使用SQL Server进行分组时遇到问题。在SQL Server中按日期分组
我有一个datetime
列,但我只能根据日期要组,
这里是我的代码
SELECT ProductCode,
ProductName,
ProductType,
UnitPrice,QTY,
Amount,
(convert(varchar, TransactionDate, 101))AS sTransactionDate
FROM DailyTransactions
GROUP BY TransactionDate, ProductCode,
ProductName,ProductType,UnitPrice,QTY,Amount
结果:
2/17/2012
出现了三次,因为它有不同的时间...
答
这应该是按日期分组的结果的快速方式:
SELECT
ProductCode,ProductName,ProductType,UnitPrice,QTY,Amount,(convert(varchar, TransactionDate, 101))AS sTransactionDate
FROM DailyTransactions
GROUP BY DATEADD(day, DATEDIFF(day, 0, TransactionDate), 0), ProductCode,ProductName,ProductType,UnitPrice,QTY,Amount
在这种情况下,我们所得到的一天的开始和日期的时间,然后取出之间的差异。
答
您可以试试:
GROUP BY
DATEPART(year, TransactionDate),
DATEPART(month, TransactionDate),
DATEPART(day, TransactionDate)
答
既然您只想显示一个结果,为什么不使用DISTINCT
?
SELECT DISTINCT ProductCode, ...
FROM ...
GROUP BY ProductCode
答
尝试在应用转换时使用CHAR(10)而不是varchar。你不应该永远声明没有长度的char/varchar。在这种情况下,您不会截断足够多的字符,因为这是一个varchar(30),而您只关心前10个字符。另外,你的小组应该包含一个相同的转换。
答
简而言之,您的GROUP BY必须出现在您选择的某处。您已经将TransactionDate转换为'仅限日期'字符串,但DATEADD和DATEDIFF实际上更有效。
因此,简单地GROUP BY相同的格式:
SELECT ProductCode,
ProductName,
ProductType,
UnitPrice,QTY,
Amount,
DATEADD(day, DATEDIFF(day, 0, TransactionDate), 0) AS sTransactionDate
FROM DailyTransactions
GROUP BY DATEADD(day, DATEDIFF(day, 0, TransactionDate), 0), ProductCode,
ProductName,ProductType,UnitPrice,QTY,Amount