Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在不重复查询的情况下计算不同的多个字段?_Sql_Count_Sql Server 2000_Distinct - Fatal编程技术网

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)
这有两个问题:

  • 不能为计数聚合列出两个不同的字段
  • 这将包括日期的时间,所以它不会过滤掉任何东西,因为它几乎总是有一个不同的时间
  • 我可以照顾2个人。通过转换为仅包含日期的varchar,可以很容易地完成,但我不确定如何处理多个不同字段的问题。我不能使用,因为我不想重复整个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两次,我只希望它计算一次

    一些基本样本数据和预期输出(跳过字段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,还是更新的版本吗?