这个简单的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>
答案 0 :(得分:3)
我不确定您为什么反对在CONVERT
和SELECT
中执行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
达伦怀特