0

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

  • 话题
  • 用户
  • ip

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

所以数据的一个例子是这样的:

在此处输入图像描述

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

在此处输入图像描述

编辑:

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

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

但是我看到您忽略了用户列,为什么?也许我的例子不好:)

让我们添加一条新记录:

在此处输入图像描述

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

SELECT DISTINCT topic, user, ip FROM MyTable;

它返回:

在此处输入图像描述

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

在此处输入图像描述

4

4 回答 4

0

尝试这个:

SELECT topic, COUNT(IP)
FROM MyTable
GROUP BY topic
于 2012-08-20T16:55:26.780 回答
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(您没有指定)而有所不同。数据类型以及连接运算符/函数可能会发生变化。它背后的概念是你不能拥有两个不同DISTINCTCOUNT列,所以你必须将它们连接起来。该#字符只是为了确保1#11与 不同11#1

于 2012-08-20T16:55:27.627 回答
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
于 2012-08-20T16:55:47.010 回答
-1

不确定你是否可以这样做

select  topic, count(COALESCE(topic,'null') + COALESCE(ip,'null')) from table
group by COALESCE(topic,'null') + COALESCE(ip,'null')
于 2012-08-20T16:57:04.847 回答