0

私はこのようなテーブルを持っています:

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

クエリまたはストアドプロシージャが、個別のテーブルと、このURLを共通に持つIDを持つ列を返すようにします(2番目の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に共通するIDのコンマ区切りの文字列です。

この場合のコンマ区切りの文字列は正しくありません。

このテーブルを作成するために使用したクエリは次のとおりです。

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 Server2008R2を使用しています。

私があなたに提示する質問は、これをどのように行うか、そしてどの方法(複数ある場合)が最も効率的かということです。

どんな助けでもいただければ幸いです。これはC#コードで行うこともできますが、ストアドプロシージャ、またはクエリのいずれか、最も簡単な方法、またはより高速な方法のいずれかで行う方がはるかに望ましいです:P

4

3 に答える 3

1

合体方式を採用しています。結果の連結文字列は、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 にまったく慣れていないので、これが古い帽子のものである場合は申し訳ありませんが、他の場所でカバーされていませんでした。

于 2012-05-22T09:37:15.330 に答える
0

これを試して:

select url, count(*), group_concat(userid) 
from sites
group by url
order by COUNT(*) desc
于 2012-04-15T10:02:57.000 に答える
0

@ビョルン・オイヴィンド・ハルヴォルセン

この質問はかなり古いですが、それに出くわし、それに光を当てることを考えました..

--- テーブルを作成

テーブル test_kin を作成します (id int, location varchar(max), url varchar(max)) go

--- いくつかの値を挿入します

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

URL順のtest_kinグループからID順

HTH、キン

于 2013-01-22T21:22:35.260 に答える