Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 对循环进行计数,并对已计数的循环进行计数

Sql 对循环进行计数,并对已计数的循环进行计数,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有我的疑问: SELECT UserGroupCode,COUNT(UserGroupCode) AS [CountofCycle] FROM Users.GroupCycles GROUP BY UserGroupCode; 这让我明白: UserGroupCode CountofCycles 1 1 4 1 5 1 6 2 (gone into

我有我的疑问:

SELECT UserGroupCode,COUNT(UserGroupCode) AS [CountofCycle]
FROM Users.GroupCycles
GROUP BY UserGroupCode;
这让我明白:

UserGroupCode CountofCycles 1 1 4 1 5 1 6 2 (gone into 2nd cycle) 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 1 我得到的结果=18,应该是16,如果我从SELECT和GROUPBY语句中删除CreateDate,我可以得到正确的循环数, 当我把条件改为CountofCycle=2或>1时,它显示为0

显示周期大于1的用户组有什么问题

这是我要过滤掉的onCreateDate查询,在我与第一个表合并的第二个表中,我不能使用CreateDate,因为它会干扰我的查询结果

SELECT Count(t.CountOfCycle) AS 'total groups' 
FROM 
    (SELECT COUNT(userGroupCode) AS [CountofCycle], CreateDate
     FROM users.GroupCycles GROUP BY userGroupCode,CreateDate)t
WHERE t.CountOfCycle=1 AND t.CreateDate Between '03/16/2017' AND '04/25/2017'


UNION ALL

SELECT Count(t.CountOfCycle) AS 'group on date2'
FROM 
    (SELECT COUNT(userGroupCode) AS [CountofCycle] FROM users.GroupCycles GROUP BY  userGroupCode)t
WHERE t.CountOfCycle=2

你可以使用
拥有
,应该可以工作(而且效率更高)


我希望看到
具有
子句,而不是
WHERE

SELECT UserGroupCode, COUNT(UserGroupCode) [CountofCycle]
FROM [Users].[GroupCycles]
GROUP BY UserGroupCode
HAVING COUNT(UserGroupCode) > 1;

首先要说明为什么没有得到预期的结果,原因很简单,因为您比较了两个不同的查询,并期望结果相同

考虑这个非常简单的示例数据

UserGroupCode   |   CreateDate
----------------+----------------
    A           |   2017-05-10
    B           |   2017-05-10
    B           |   2017-05-11
    C           |   2017-05-10
您有两条记录,其中
UserGroupCode
B
,因此如果您运行:

DECLARE @T TABLE (UserGroupCode CHAR(1), CreateDate DATE)
INSERT @T (userGroupCode, CreateDate) 
VALUES ('A', '2017-05-10'), ('B', '2017-05-10'), ('B', '2017-05-11');

SELECT  UserGroupCode, COUNT(*) AS [Count]
FROM    @T
GROUP BY UserGroupCode
HAVING COUNT(*) = 2;
这将返回:

UserGroupCode   Count
-------------------------
    B           2
UserGroupCode   CreateDate      Count
---------------------------------------
    B           2017-05-10      1
    B           2017-05-11      1
但是,如果要将
CreateDate
添加到分组中,“B”将分为两个组,每个组的计数为1:

DECLARE @T TABLE (UserGroupCode CHAR(1), CreateDate DATE)
INSERT @T (userGroupCode, CreateDate) 
VALUES ('A', '2017-05-10'), ('B', '2017-05-10'), ('B', '2017-05-11');

SELECT  UserGroupCode, CreateDate, COUNT(*) AS [Count]
FROM    @T
WHERE   UserGroupCode = 'B'
GROUP BY UserGroupCode, CreateDate;
这将返回:

UserGroupCode   Count
-------------------------
    B           2
UserGroupCode   CreateDate      Count
---------------------------------------
    B           2017-05-10      1
    B           2017-05-11      1
现在,根据您发布的查询,您似乎想知道

  • 在2017年3月16日至2017年4月25日的日期范围内只有一项记录的组数
  • 总共有两条记录的组数
  • 为此,考虑一个稍微大一些的数据集:

    UserGroupCode   |   CreateDate
    ----------------+----------------
        A           |   2017-04-10
        B           |   2017-04-10
        B           |   2017-05-11
        C           |   2017-01-01
        C           |   2017-01-02
        D           |   2017-04-01
        D           |   2017-04-02
        E           |   2017-01-02
    
    所以在这里

    • A组共有一条记录,且在日期范围内
    • B组共有两条记录,在日期范围内,一条不在日期范围内
    • C组有两条记录,都不在日期范围内
    • D组有两条记录,都在日期范围内
    • E组有一条记录,不在日期范围内
    因此,对于您的第一个要求:

  • 在2017年3月16日至2017年4月25日的日期范围内只有一项记录的组数
  • 我们希望有两个组,A和B,因为C和E在日期范围内没有记录,D有两个

    第二组是B组、C组和D组,因为A组和E组各只有一条记录

    通过使用条件聚合,您可以通过单个查询实现这一点

    DECLARE @T TABLE (UserGroupCode CHAR(1), CreateDate DATE)
    INSERT @T (userGroupCode, CreateDate) 
    VALUES ('A', '2017-04-10'), 
            ('B', '2017-04-10'), ('B', '2017-05-11'), 
            ('C', '2017-01-01'), ('C', '2017-01-02'),
            ('D', '2017-04-01'), ('D', '2017-04-02'),
            ('E', '2017-01-02');
    
    SELECT  TotalGroups = COUNT(CASE WHEN RecordsInPeriod = 1 THEN 1 END),
            GroupOnDate2 = COUNT(CASE WHEN TotalRecords = 2 THEN 1 END)
    FROM    (   SELECT  UserGroupCode,
                        TotalRecords = COUNT(*),
                        RecordsInPeriod = COUNT(CASE WHEN CreateDate >= '20170316'
                                                    AND CreateDate <= '20170425' THEN 1 END)
                FROM    @T
                GROUP BY UserGroupCode
            ) AS t;
    

    您的第一个查询和第二个查询是不同的。在第一个组中,您仅按
    UserGroupCode
    分组,而在第二个组中,您也按
    CreateDate
    分组。第二级分组很可能没有任何计数为2或2以上的记录。您说过“如果我从SELECT和GROUP BY语句中删除CreateDate,我可以获得正确的CountofCycles数”,那么问题出在哪里?如果知道“选择”和“分组依据”的结果不正确,为什么要将
    CreateDate
    添加到“选择”和“分组依据”?我需要CreateDate按CreationDate筛选分组您如何筛选
    CreateDate
    ?你能发布你的最终查询吗?您不能在子查询中执行此操作,因此您不需要将其包含在group by中吗?是的,请检查上面的内容我不同意
    拥有
    是一种更简洁的解决方案,但它不会更有效。SQL Server非常聪明,能够计算出两个查询的含义相同,因此生成了相同的计划-我对最后一个括号有意见,它在“')”附近显示了不正确的语法。@TilekN。是的,我的坏,别名子查询,它不工作,不工作,它的查询和我的相同。HAVING语句没有强烈指定条件,它只给我null或0个hanks,但我已经计算过了,我需要计算结果,正如你在上面所看到的(第二次查询)啊,在这种情况下,使用嵌套查询答案(或视图?)这就是我需要帮助的地方,请你展示一下,如果你不介意的话,你只是让我的一天更快乐了,非常感谢你!最后一个问题,GroupOnDate 2如果我代替Count(*)将TotalRecords=Count(当CreateDate='04/17/2017'时为2结束),它会显示我插入的日期,以及周期的CountofCycles>2吗?
    TotalGroups     GroupOnDate2
    ------------------------------
        2               3