如何获得按一列分组的总计?

时间:2012-08-20 16:51:38

标签: sql count

我有一个包含三列的表(除了id):

  • 主题
  • 用户
  • IP

Topic不能为空,但另外两个可以。没有独特的限制。

所以数据的一个例子是:

enter image description here

我想得到的是userip的独特组合,并计算按主题分组的结果行:

enter image description here

编辑:

好的,第一个流行的答案是:

SELECT topic, COUNT(IP)
FROM MyTable
GROUP BY topic;

但是我看到你忽略了用户专栏,为什么?也许我的榜样不好:)

让我们添加一条新记录:

enter image description here

运行上面的查询会给我们相同的结果,但这是错误的:

SELECT DISTINCT topic, user, ip FROM MyTable;

它返回:

enter image description here

所以在这种情况下,总数将是:

enter image description here

4 个答案:

答案 0 :(得分:0)

试试这个:

SELECT topic, COUNT(IP)
FROM MyTable
GROUP BY topic

答案 1 :(得分:0)

对于您期望的结果,这是查询:

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(您未指定)而变化。数据类型可能会更改,以及连接运算符/函数。它背后的概念是,DISTINCT中的COUNT不能包含2个不同的列,因此您必须将它们连接起来。 #字符只是为了确保1#1111#1不同。

答案 2 :(得分:0)

SELECT Topic, COUNT(*) [Count]
FROM table
WHERE IP IS NOT NULL
GROUP BY Topic

样品:

-- 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

编辑问题:

;WITH TMP AS
(
    SELECT DISTINCT topic, [user], ip
    FROM @tbl
) 
SELECT Topic, COUNT(*)
FROM TMP
GROUP BY Topic

答案 3 :(得分:-1)

不确定你是否可以这样做

select  topic, count(COALESCE(topic,'null') + COALESCE(ip,'null')) from table
group by COALESCE(topic,'null') + COALESCE(ip,'null')