【发布时间】:2012-03-28 16:10:27
【问题描述】:
我有一个包含多个分组的查询,每月返回一个计数。像这样的:
SELECT field1, field2, year(someDate), month(someDate), count(*) as myCount
FROM myTable
WHERE field5 = 'test'
GROUP BY field1, field2, year(someDate), month(someDate)
问题是我希望每天的计数都是不同的,基于 id 字段 + 日期字段(没有时间)。如,我想每天、每月获得不同的 id 计数。所以我想要这样的东西:
SELECT field1, field2, year(someDate), month(someDate),
count(distinct someID, someDate) as myCount
FROM myTable
WHERE field5 = 'test'
GROUP BY field1, field2, year(someDate), month(someDate)
这有两个问题:
- 您不能为计数汇总列出 2 个不同的字段
- 这也将包括日期的时间,因此它不会过滤掉任何内容,因为它几乎总是有不同的时间
我可以通过转换为仅包含日期的 varchar 轻松处理 2.,但我不确定如何处理多个不同字段的问题。我不能使用this solution,因为我不想重复整个 where 子句和 group by 子句。这是我想出的:
SELECT field1, field2, year(someDate), month(someDate),
count(distinct someID + CONVERT(VARCHAR, someDate, 112)) as myCount
FROM myTable
WHERE field5 = 'test'
GROUP BY field1, field2, year(someDate), month(someDate)
我没有在逗号分隔的列表中列出不同的字段,而是将它们连接起来。我应该注意这种方法有什么缺点吗?我可以指望它是准确的吗?而且 - 有没有更好的方法来实现这一点?
基本上,我是按月分组,但“不同”计数应该基于天。例如,如果我在 1 月 3 日和 1 月 5 日有 id 31,我希望它在 1 月算作 2,但如果我在 1 月 3 日有两次 id 31,我只希望它算一次。
一些基本示例数据和预期输出(为此跳过 field1 和 field2):
*Date* *ID*
1/3/12 00:00:09 22
1/3/12 00:13:00 22
1/4/12 12:00:00 22
1/7/12 15:00:45 27
1/15/12 15:00:00 22
2/6/12 00:00:09 50
2/8/12 00:13:00 44
2/8/12 12:00:00 45
2/22/12 15:00:45 33
2/22/12 15:00:00 33
2/22/12 15:00:00 44
*Year* *Month* *Count*
2012 Jan 4
2012 Feb 5
【问题讨论】:
-
如果您在查询中按
someID和someDate进行分组,则每行someID和someDate的不同组合的数量将始终为1。我们是否应该假设您想要返回没有在主查询中分组的不同字段组合的数量,或者您想要计算查询返回的几个不同行的组合?您能否确认您使用的是 SQLServer 2000 还是更新的版本?
标签: sql count sql-server-2000 distinct