2012-03-21 127 views
1

這個簡單的SQL問題給我一個非常困難的時間。要麼因爲我以錯誤的方式看到問題,要麼因爲我不熟悉SQL。或兩者。SQL Server:選擇日期時間並按日期分組

我在做什麼:我有一個表有幾列,我只需要其中兩個:創建條目的日期時間和條目的ID。請注意,這裏的時間/分鐘/秒部分重要。

但是,我想根據DATE部分對我的選擇進行分組。否則,所有的團體將最有可能有1個元素。

這裏是我的查詢:

SELECT MyDate as DateCr, COUNT(Id) as Occur 
FROM MyTable tb WITH(NOLOCK) 
GROUP BY CAST(tb.MyDate as Date) 
ORDER BY DateCr ASC 

但是我從中得到以下錯誤:

,因爲它不是在聚合函數載列「MyTable.MyDate」在選擇列表中無效或GROUP BY子句。

如果我不在GROUP BY中執行演員,一切都很好。如果在SELECT中將MyDate投射到DATE,並保留GROUP BY中的CAST,那麼再一次罰款。顯然,它希望在GROUP BY中保持與SELECT中相同的DATE或DATETIME格式。

我的方法可能是完全錯誤的,所以我而不是必須尋求解決上述查詢,但找到正確的方法來做到這一點。

LE:我得到的第1行

LE2上述錯誤:在第二次看,我的問題確實也不是很明確的。如果完全錯誤,您可以忽略上述方法。下面是一個示例場景

讓我告訴你我需要什麼:我想在每個條目創建時檢索(1)DateTime。所以如果我有20個條目,那麼我想獲得20個日期時間。那麼如果我在同一天創建了多個條目,我想要這些條目的數量。例如,假設我在星期一創建了3個條目,星期二創建了1個條目,今天創建了2個條目。然後從我的表格中,我需要這6個條目的日期時間+每天創建的條目數(2012年3月19日爲3,2012年3月20日爲1,2012年3月21日爲2)。

回答

3

我不知道你爲什麼反對在SELECTGROUP BY中執行CONVERT。這似乎是這樣做完全合乎邏輯的方式:

SELECT 
    DateCr = CONVERT(DATE, MyDate), 
    Occur = COUNT(Id) 
FROM dbo.MyTable 
GROUP BY CONVERT(DATE, MyDate) 
ORDER BY DateCr; 

如果你想保留的MyDate時間部分在SELECT列表,你爲什麼要費心去組?或者你期望結果如何?對於每個單獨的日期/時間值,您都會有一行,分組似乎表明您每天都需要一行。也許你可以用一些樣本數據和例子期望的結果來澄清你想要的。

另外,你爲什麼使用NOLOCK?您是否願意爲偶爾的渦輪按鈕交易準確性?

編輯增加對混合需求的版本:

;WITH d(DateCr,d,Id) AS 
(
    SELECT MyDate, d = CONVERT(DATE, MyDate), Id 
    FROM dbo.MyTable) 
SELECT DateCr, Occur = (SELECT COUNT(Id) FROM d AS d2 WHERE d2.d = d.d) 
FROM d 
ORDER BY DateCr; 
+0

在第二次看,我的問題確實也不是很明確的。讓我告訴你我需要什麼: 我想檢索(1)每個條目創建時的日期時間。所以如果我有20個條目,那麼我想獲得20個日期時間。那麼如果我在同一天創建了多個條目,我想要這些條目的數量。 例如,假設我在星期一創建了3個條目,週二創建了1個條目,今天創建了2個條目。然後從我的表格中,我需要這6個條目的日期時間+每天創建的條目數(2012年3月19日爲3,2012年3月20日爲1,2012年3月21日爲2)。 – Kaisar 2012-03-21 17:08:06

+0

Aaron - 出於興趣,這是一個性能問題轉換在選擇和組按名單? – Bridge 2012-03-21 17:19:24

+0

所以你想要星期一的單個日期/時間值,然後從星期一開始的每行都有*完全相同的計數?爲什麼不在兩個單獨的查詢中執行此操作 – 2012-03-21 17:20:57

0

儘管這是一個老帖子,我想我會回答。下面的解決方案將適用於SQL Server 2008及更高版本。它使用over子句,以便返回各個行,但也會計算按日期分組的行(無時間)。

SELECT MyDate as DateCr, 
     COUNT(Id) OVER(PARTITION BY CAST(tb.MyDate as Date)) as Occur 
FROM MyTable tb WITH(NOLOCK) 
ORDER BY DateCr ASC 

達倫·懷特