每个不同行的SQL查询或过程具有不同的逗号分隔值

时间:2012-04-15 10:00:14

标签: sql sql-server-2008-r2

我有一张这样的表:

218 4   AudioVerse     https://www.audioverse.org/english/podcasts/latest   Latest      NULL    2012-03-29 15:32:44.287
222 7   TPB            http://rss.thepiratebay.se/0             Alt     NULL    2012-03-31 17:55:49.223
223 7   EZTV           http://www.ezrss.it/feed/                Alt     NULL    2012-03-31 17:56:41.573
226 11  The Piratebay  http://rss.thepiratebay.se/100               Audio Only  NULL    2012-04-04 14:57:45.377
227 11  The Piratebay  http://rss.thepiratebay.se/200               Video Only  NULL    2012-04-04 14:58:04.650
229 15  ThePirateBay   http://rss.thepiratebay.se/200                       NULL    2012-04-06 22:40:12.730
230 14  The Pirate Bay http://rss.thepiratebay.se/0                     NULL    2012-04-08 00:59:13.217
232 14  AudioVerse     https://www.audioverse.org/english/podcasts/latest           NULL    2012-04-08 01:03:22.787
233 14  EZTV           http://www.ezrss.it/feed/                        NULL    2012-04-08 01:20:55.860
234 17  Twit           http://twit.tv/node/feed                     NULL    2012-04-13 18:59:23.037
235 17  Diggnation     http://revision3.com/diggnation/feed/MP4-Large       Video Large NULL    2012-04-13 19:01:52.817

我想要一个查询或存储过程来返回一个返回distinct的表,AND一个列有一个共同具有此url的id的列(第二个id列(4,7,11,15,14,17)是有问题的id)以逗号分隔的形式,如下所示:

http://rss.thepiratebay.se/0    3   4,5,7,7,11,11,15,14,14,14,17,17
http://rss.thepiratebay.se/200  2   4,5,7,7,11,11,15,14,14,14,17,17
http://www.ezrss.it/feed/   2   4,5,7,7,11,11,15,14,14,14,17,17
https://www.audioverse.org/english/podcasts/latest  2   4,5,7,7,11,11,15,14,14,14,17,17
http://revision3.com/diggnation/feed/MP4-Large  1   4,5,7,7,11,11,15,14,14,14,17,17
http://twit.tv/node/feed    1   4,5,7,7,11,11,15,14,14,14,17,17
http://rss.thepiratebay.se/100  1   4,5,7,7,11,11,15,14,14,14,17,17

这里第一列是不同的url,下一个是url存在的次数(与上面的主表不同,但是你得到了点),以及逗号分隔的字符串,这些字符串是这些url所具有的共同的。

在这种情况下,以逗号分隔的字符串不正确。

我用来创建此表的查询是:

DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+',' ,'') + cast(userid as varchar)
FROM sites

select url, COUNT(*), (@listStr)
from sites
group by url
order by COUNT(*) desc

我使用的是SQL Server 2008 R2。

我向您呈现的问题是:如何做到这一点,以及哪种方式(如果有多个方式)效率最高?

任何帮助将不胜感激。我可以在C#代码中执行此操作,但我更倾向于在存储过程或查询中使用它,这是最简单的和/或更快的:P

3 个答案:

答案 0 :(得分:1)

我使用coalesce方法。我发现生成的连接字符串取决于在使用COALESCE之前是否使用值声明了字符串。以下脚本演示了这一点:

DECLARE @Mystring nvarchar( 500 ); --declare but do not set inital value

CREATE TABLE dbo.mytable( id int IDENTITY(1 , 1) PRIMARY KEY , name nvarchar( 40 ));

INSERT INTO mytable( name )
VALUES( 'Peter' ) , ( 'Paul' ) ,( 'Mary' );

SELECT @Mystring = COALESCE( @Mystring + ',' , '' ) + name
  FROM dbo.mytable
  ORDER BY id;

PRINT @Mystring; -- will print 'Peter,Paul,Mary' with no leading comma

SET @Mystring = ''; --now set to initial empty string
SELECT @Mystring = COALESCE( @Mystring + ',' , '' ) + name
  FROM dbo.mytable
  ORDER BY id;

PRINT @Mystring; --will print ',Peter,Paul,Mary' ie with leading comma

我不知道为什么tsql这样做(我使用的是2008 R2 Express),但值得注意。我现在将字符串变量初始化为空字符串,并使用SUBSTRING()函数删除前导分隔符以确保一致的行为。

我对tsql很陌生,如果这是旧帽子,我很抱歉,但我没有在其他地方找到它。

答案 1 :(得分:0)

试试这个:

select url, count(*), group_concat(userid) 
from sites
group by url
order by COUNT(*) desc

答案 2 :(得分:0)

@BjørnØyvindHalvorsen

这个问题与OLD有关,但偶然发现并想到了解决它的问题。

---创建表

create table test_kin(id int,location varchar(max),url varchar(max)) 去

---插入一些值

插入test_kin值(4,'AudioVerse','https://www.audioverse.org/english/podcasts/latest')
插入test_kin值(7,'TPB','http://rss.thepiratebay.se/0')
插入test_kin值(7,'EZTV','http://www.ezrss.it/feed/')
插入test_kin值(11,'The Piratebay','http://rss.thepiratebay.se/100')
插入test_kin值(11,'The Piratebay','http://rss.thepiratebay.se/200')
插入test_kin值(15,'ThePirateBay','http://rss.thepiratebay.se/200')
插入test_kin值(14,'The Pirate Bay','http://rss.thepiratebay.se/0')
插入test_kin值(14,'AudioVerse','https://www.audioverse.org/english/podcasts/latest')
插入test_kin值(14,'EZTV','http://www.ezrss.it/feed/')
插入test_kin值(17,'Twit','http://twit.tv/node/feed')
插入test_kin值(17,'Diggnation','http://revision3.com/diggnation/feed/MP4-Large')

---查询以产生结果

select distinct url
,count(*) as ID
,stuff((
        select ',' + cast([id] as varchar(max))
        from test_kin
        for xml path('')
        ), 1, 1, '') as Result

来自test_kin 按网址分组 按ID排序

HTH, 健