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