如何使查询计算哪个字符串在某列中显示最多?

时间:2012-04-11 14:50:30

标签: c# sql-server

我正在创建一个程序,我需要对数据库进行查询,询问在给定列中最常出现的字符串。在这个例子中,它的“stringONE”。

----------------------------
|  ID  |  Column (string)  |
----------------------------
|  1   |     stringONE     |
----------------------------
|  2   |     stringTWO     |
----------------------------
|  3   |     stringONE     |
----------------------------
|  4   |     stringONE     |
----------------------------

现在我需要获取最多出现的字符串的名称并将其放入变量字符串中,例如:

string most_appeared_string = sql.ExecuteScalar();

此外,如果没有出现最多的字符串会发生什么,而是出现相同数量的2个或更多字符串,如下所示:

----------------------------
|  ID  |  Column (string)  |
----------------------------
|  1   |     stringONE     |
----------------------------
|  2   |     stringTWO     |
----------------------------
|  3   |     stringTWO     |
----------------------------
|  4   |     stringONE     |
----------------------------

非常感谢。


@KeithS

你有一个sql-server版本的查询,因为我在那里尝试时遇到了一些错误。这是我想要做的事情的表格示例。

------------------------------------------------
|  ID  |  column1 (string) |  author (string)  |
------------------------------------------------
|  1   |     string-ONE    |       John        |
------------------------------------------------
|  2   |     string-TWO    |       John        |
------------------------------------------------
|  3   |     string-ONE    |      Martin       |
------------------------------------------------
|  4   |     string-ONE    |       John        |
------------------------------------------------

SELECT TOP (1) column1, COUNT(*) FROM table WHERE author='John' ORDER BY ID

它应该返回“string-ONE”,因为它似乎是作者John的最多(2)次。在MS-SQL Management Studio中尝试查询时,这是我得到的错误:

Column 'table.column1' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

没关系编辑。谢谢。

3 个答案:

答案 0 :(得分:3)

这是一个非常简单的查询(至少在T-SQL中):

select top 1 Column, Count(*) from Table group by Column order by Count(*) desc

ExecuteScalar,通过实现细节,将返回字符串值,因为它是结果集中唯一行的第一列,即使有两列。您还可以使用ExecuteReader来访问字符串发生的次数。

答案 1 :(得分:2)

select top (1) SomeCol, count(*) as Row_Count
from YourTable
group by SomeCol
order by Row_Count desc
  

此外,如果没有出现最多的字符串会发生什么   2个或更多字符串出现的次数相同,如下所示:

在这种情况下,使用上述查询,您将获得一个任意行。您可以添加with ties以获取具有相同最高值的所有行。

select top (1) with ties SomeCol, count(*) as Row_Count
from YourTable
group by SomeCol
order by Row_Count desc

答案 2 :(得分:1)

SELECT max(counted) AS max_counted FROM (
   SELECT count(*) AS counted FROM counter GROUP BY date
 )

这可以解决问题