Sql 如何在不重复查询的情况下计算不同的多个字段?
我有一个查询,有几个分组,每个月返回一个计数。大概是这样的:Sql 如何在不重复查询的情况下计算不同的多个字段?,sql,count,sql-server-2000,distinct,Sql,Count,Sql Server 2000,Distinct,我有一个查询,有几个分组,每个月返回一个计数。大概是这样的: SELECT field1, field2, year(someDate), month(someDate), count(*) as myCount FROM myTable WHERE field5 = 'test' GROUP BY field1, field2, year(someDate), month(someDate) SELECT field1, field2, year(someDate), month(someD
SELECT field1, field2, year(someDate), month(someDate), count(*) as myCount
FROM myTable
WHERE field5 = 'test'
GROUP BY field1, field2, year(someDate), month(someDate)
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)
问题是,我希望每天的计数是不同的,基于id字段+日期字段(不含时间)。如中所示,我希望获得每天、每月ID的不同计数。所以我想要这样的东西:
SELECT field1, field2, year(someDate), month(someDate), count(*) as myCount
FROM myTable
WHERE field5 = 'test'
GROUP BY field1, field2, year(someDate), month(someDate)
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)
这有两个问题:
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两次,我只希望它计算一次
一些基本样本数据和预期输出(跳过字段1和字段2):
已更新 根据您的样本数据,这将给出所需的结果:
Declare @Tab table ([Date] datetime,ID int)
insert into @Tab([Date],ID) values
('2012-01-03T00:00:09.000', 22),
('2012-01-03T00:13:00.000', 22),
('2012-01-04T12:00:00.000', 22),
('2012-01-07T15:00:45.000', 27),
('2012-01-15T15:00:00.000', 22),
('2012-02-06T00:00:09.000', 50),
('2012-02-08T00:13:00.000', 44),
('2012-02-08T12:00:00.000', 45),
('2012-02-22T15:00:45.000', 33),
('2012-02-22T15:00:00.000', 33),
('2012-02-22T15:00:00.000', 44)
select DATEADD(month,DATEDIFF(month,0,[Date]),0) as MonthStart,SUM(distinctDayIDs)
from
(
SELECT DATEADD(day,DATEDIFF(day,0,[Date]),0) as [Date],
count(distinct ID) as distinctDayIDs
FROM @Tab
--WHERE field5 = 'test'
GROUP BY DATEADD(day,DATEDIFF(day,0,[Date]),0)
) t
group by DATEADD(month,DATEDIFF(month,0,[Date]),0)
我认为,因为我们每天都要进行计数,所以我们必须将其作为两个单独的分组操作来进行
旧答案 听起来所需的输出应该是
field1
,field2
,日期,以及该日期不同ID的计数
如果是这样的话,我认为你把事情复杂化了:
SELECT field1, field2, DATEADD(day,DATEDIFF(day,0,someDate),0) as Date,
count(distinct someID) as myCount
FROM myTable
WHERE field5 = 'test'
GROUP BY ffield1, field2, DATEADD(day,DATEDIFF(day,0,someDate),0)
(我正在使用DATEADD
/DATEDIFF
剥离时间部分,而不是转换为varchar
)您可以尝试计数“”:
或准备CTE选择:
;with cte as (
select someDate, count( someID) as myCount
from myTable
group by someDate)
select m.field1, m.field2, m.someID, m.someDate, cte.myCount
from myTable m inner join cte
on m.someDate = cte.someDate
where ...
你是对的,我遗漏了一些适用的信息-我不想要每天不同ID的数量,我想要每月的数量,但是每天不同ID的数量。更新问题,因此如果这没有意义,请检查there@froadie-是的,最好提供一些示例数据,以便我们更好地了解您的目标。(表中的数据示例和查询的预期结果会很好)@froadie-答案顶部的新查询给出了所需的结果。与我的查询相比,您的查询有什么好处?首先,它明确指出,
COUNT
规则是每天计算不同的ID,如果您在查询中按someID
和someDate
进行分组,那么总体结果应该是每月的总数(诚然,在您对DATEADD
/DATEDIFF
方法感到满意之前,它可能看起来很复杂,someID
和someDate
的不同组合数在每行上始终为1。我们是否应该假设您想要返回未在主查询中分组的字段的不同组合的数量,或者您想要计算查询返回的多个不同行的组合?您还可以确认您使用的是SQLServer2000,还是更新的版本吗?