在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