Sql 如何将总计按一列分组?
我有一个有三列的表(除了id):Sql 如何将总计按一列分组?,sql,count,Sql,Count,我有一个有三列的表(除了id): 话题 使用者 知识产权 Topic不能为空,但其他两个可以为空。没有独特的限制 因此,数据示例如下: 我想得到的是user和ip的不同组合,并按主题对结果行进行分组: 编辑: 好的,第一个流行的答案是: SELECT topic, COUNT(IP) FROM MyTable GROUP BY topic; 但是我看到你忽略了用户栏,为什么?也许我的例子不好:) 让我们添加一个新记录: 运行上述查询将得到相同的结果,但这是错误的: SELECT DI
- 话题
- 使用者
- 知识产权
Topic
不能为空,但其他两个可以为空。没有独特的限制
因此,数据示例如下:
我想得到的是user
和ip
的不同组合,并按主题对结果行进行分组:
编辑:
好的,第一个流行的答案是:
SELECT topic, COUNT(IP)
FROM MyTable
GROUP BY topic;
但是我看到你忽略了用户栏,为什么?也许我的例子不好:)
让我们添加一个新记录:
运行上述查询将得到相同的结果,但这是错误的:
SELECT DISTINCT topic, user, ip FROM MyTable;
它返回:
因此,在这种情况下,总数为:
试试这个:
SELECT topic, COUNT(IP)
FROM MyTable
GROUP BY topic
对于您期望的结果,以下是查询:
select topic, count(ip)
from YourTable
group by topic
请注意,COUNT
仅计算非空值
更新
在编辑和进一步澄清后,您可以执行以下操作:
select topic, count(*)
from (SELECT DISTINCT topic, user, ip FROM YourTable) sel
group by topic
或者这个:
select topic, count(distinct cast(ip as varchar) + '#' + cast(user as varchar))
from YourTable
group by topic
在第二种方法中,查询可能必须根据您的RDBMS(您没有指定)而有所不同。数据类型可能会更改,连接运算符/函数也可能会更改。它背后的概念是,在COUNT
中不能有两个不同列的DISTINCT
,因此必须将它们连接起来。#
字符只是为了确保1#11
与11#1
不同
样本:
-- preparing the data
DECLARE @tbl TABLE (Topic int, [User] int, IP varchar(20))
INSERT INTO @tbl VALUES
(1,1,null),
(1,1,null),
(1,1,null),
(1,null,'127.0.0.1'),
(1,null,'127.0.0.1'),
(2,1,null),
(2,null,'127.0.0.1'),
(2,null,'127.0.0.1');
-- getting the resuls
SELECT Topic, COUNT(*) [Count]
FROM @tbl
WHERE IP IS NOT NULL
GROUP BY Topic
经编辑的问题:
不确定你是否能做到这一点
select topic, count(COALESCE(topic,'null') + COALESCE(ip,'null')) from table
group by COALESCE(topic,'null') + COALESCE(ip,'null')
如果排除NULL,则两个主题的计数都不会为2和2,因此这与所需的输出不匹配。我认为安倍是对的,它会是一样的,我会附上样品,你可以复制,粘贴和运行,看看结果会是一样的。事实上,安倍的答案也差不多。他也排除了null,使用了COUNT(ip),我做得更明确一些。结果是一样的,但我认为这种方法过于复杂。不过,这并没有错。
;WITH TMP AS
(
SELECT DISTINCT topic, [user], ip
FROM @tbl
)
SELECT Topic, COUNT(*)
FROM TMP
GROUP BY Topic
select topic, count(COALESCE(topic,'null') + COALESCE(ip,'null')) from table
group by COALESCE(topic,'null') + COALESCE(ip,'null')