将TSQL中的重复行分组

将TSQL中的重复行分组,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我在SQL Server 2005中有以下表格和数据: create table LogEntries ( ID int identity, LogEntry varchar(100) ) insert into LogEntries values ('beans') insert into LogEntries values ('beans') insert into LogEntries values ('beans') insert into LogEntries values

我在SQL Server 2005中有以下表格和数据:

create table LogEntries (
  ID int identity,
  LogEntry varchar(100)
)

insert into LogEntries values ('beans')
insert into LogEntries values ('beans')
insert into LogEntries values ('beans')
insert into LogEntries values ('cabbage')
insert into LogEntries values ('cabbage')
insert into LogEntries values ('beans')
insert into LogEntries values ('beans')
我想对重复的日志条目进行分组,以便得到以下结果:

LogEntry  EntryCount
beans     3
cabbage   2
beans     2

除了使用游标之外,您能想到在TSQL中实现这一点的任何方法吗?

SQL不完全是我的强项,但不会

SELECT LogEntry, COUNT(1) AS Counter FROM LogEntries GROUP BY LogEntry

做吗?

我不认为一个查询就可以做到这一点。为了在查询中提供计数,需要使用LogEntry列进行分组。但是,这只会给出每个日志条目的总计数,而不是您要查找的序列条目数。我认为需要一个游标(或者将整个数据集带到应用程序中,并使用那里的逻辑来获得所需的结果)。

除非我的大脑今天早上还没有启动

SELECT 
  LogEntry, COUNT(LogEntry) as EntryCount
FROM
  LogEntries
GROUP BY
  LogEntry

现在,我已经仔细研究了每个实际问题:-)


嗯,重新考虑一下,为什么不用光标呢?性能并不总是比直接SQL差,而且当其他人看到代码时,他们很容易遵循代码。将它封装在存储的进程或函数中,您就可以在任何需要的地方使用它。

这是一个基于集合的问题解决方案。性能可能会很差,但它是有效的:)


第一组bean需要ISNULL()

我想这就行了。。。但检查得不够彻底

select 
    COUNT(*),subq.LogEntry 
from 
(
    select 
        ROW_NUMBER() OVER(ORDER BY id)-ROW_NUMBER() OVER(PARTITION BY logentry ORDER BY id) as t,*
    from 
        LogEntries
) subq 
group by 
    subq.t,subq.LogEntry 
order by 
    MIN(subq.ID)

不,这将导致豆-5卷心菜-2Ah,下降到熊坑了。哦,好吧。至少我有很好的同伴:)不,这会导致豆子-5卷心菜-2奶油!谢谢,这比我写的光标要简单得多。我也开始衰老了,现在我看到了,我过去也用过这种基于集合的解决方案。谢谢,它确实有效。我以前没有使用过partition关键字。这很有趣。这是OVER()函数的一个非常优雅和巧妙的用法。美好的整洁的我不太懂分居。。。应该这样做!
beans   3
cabbage 2
carrots 1
beans   2
carrots 1
select 
    COUNT(*),subq.LogEntry 
from 
(
    select 
        ROW_NUMBER() OVER(ORDER BY id)-ROW_NUMBER() OVER(PARTITION BY logentry ORDER BY id) as t,*
    from 
        LogEntries
) subq 
group by 
    subq.t,subq.LogEntry 
order by 
    MIN(subq.ID)