2012-03-21 128 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 

达伦·怀特