SQL Server:选择DateTime并按日期分组

时间:2012-03-21 16:43:29

标签: sql-server-2008 datetime date group-by

这个简单的SQL问题让我很难过。要么是因为我看错了问题,要么因为我不熟悉SQL。或两者兼而有之。

我正在尝试做什么:我有一个包含多个列的表,我只需要其中两个:创建条目的日期时间和条目的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并将CAST保留在GROUP BY中,那么一切都会好起来的。显然,它希望在GROUP BY中保持与SELECT中相同的DATE或DATETIME格式。

我的方法可能完全错误,所以我一定要修复上述查询,但找到正确的方法。

LE:我在第1行得到了上述错误。

LE2:再看看,我的问题确实不是很明确。如果完全错误,您可以忽略上述方法。以下是示例方案

让我告诉你我需要什么:我想在每个条目创建时检索(1)DateTime。所以,如果我有20个条目,那么我想获得20个DateTimes。然后,如果我在同一天创建了多个条目,我想要这些条目的数量。例如,假设我在星期一创建了3个条目,在星期二创建了1个条目,在今天创建了2个条目。然后从我的表中我需要这6个条目的日期时间+每天创建的条目数(2012年3月19日3个,2012年3月20日1个,2012年3月21日2个)。 / p>

2 个答案:

答案 0 :(得分:3)

我不确定您为什么反对在CONVERTSELECT中执行GROUP BY。这似乎是一种完美的逻辑方式:

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;

答案 1 :(得分: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
达伦怀特