2012-02-20 121 views
4

我在使用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出現了三次,因爲它有不同的時間...

回答

2

這應該是按日期分組的結果的快速方式:

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 

在這種情況下,我們所得到的一天的開始和日期的時間,然後取出之間的差異。

2

您可以試試:

GROUP BY 
    DATEPART(year, TransactionDate), 
    DATEPART(month, TransactionDate), 
    DATEPART(day, TransactionDate) 
2

既然您只想顯示一個結果,爲什麼不使用DISTINCT

SELECT DISTINCT ProductCode, ... 
FROM ... 
GROUP BY ProductCode 
1

嘗試在應用轉換時使用CHAR(10)而不是varchar。你不應該永遠聲明沒有長度的char/varchar。在這種情況下,您不會截斷足夠多的字符,因爲這是一個varchar(30),而您只關心前10個字符。另外,你的小組應該包含一個相同的轉換。

2

簡而言之,您的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