2016-05-04 4 views
0

2つの列MentionedUserIdsnvarchar)とCreatedUserIdint)という2つの列を持つテーブルがあります。SQL Serverの異なる列からの出現数に応じたカウントID

各ユーザーの出現回数をカウントしたいと思います。ユーザーが別のテーブルに格納されている

UserId MentionedUserCount CreatorUserCount 
------------------------------------------- 
4  1     1 
5  0     1 
10  2     0 
11  1     0 
12  1     0 
13  2     0 
15  1     0 

Id MentionedUserId CreatorUserId 
-------------------------------- 
1 10,11,12,13  4 
2 10,13,15,4  5 

は、私はこのような結果を必要としています。

+1

**ヒント:使用可能なマイクロソフトフルテキスト検索では

** 1列に**しない**ストア、複数の値を行う - この**ひどく悪いデザイン**であり、データベース設計の最初の通常の形式にも違反しています。適切なリレーショナル構造を使用し、カラムあたり1つの*値を格納します。 –

+0

なぜ 'MiredUserCount'の' UserId'12が '0'ですか? –

+0

申し訳ありませんが、それは1でなければなりません。ありがとう –

答えて

0

データは一度正規化されると問題になりません。これは任意の数のfunctions or tricksによって行うことができます。 XMLトリックを通じ

With Src As (
    Select * From (Values 
     (1, '10,11,12,13', 4), 
     (2, '10,13,15,4' , 5) 
    ) V (Id, MentionedUserId, CreatorUserId) 
), Normalised As (
    Select CreatorUserId, CAST(display_term AS int) As MentionedUserId 
    From Src 
    Cross Apply (
     Select display_term 
     From sys.dm_fts_parser('"' + MentionedUserId + '"', 1033, 0, 0) 
     Where display_term NOT Like 'nn%' 
    ) Split 
), UserList As (
    Select CreatorUserId As UserId From Normalised Union 
    Select MentionedUserId   From Normalised 
) 
Select UserId, 
    (Select Count(*) From Normalised Where MentionedUserId = UserId) As MentionedUserCount, 
    (Select Count(*) From Src  Where CreatorUserId = UserId) As CreatorUserCount 
From UserList; 

With Src As (
    Select * From (Values 
     (1, '10,11,12,13', 4), 
     (2, '10,13,15,4' , 5) 
    ) V (Id, MentionedUserId, CreatorUserId) 
), Normalised As (
    Select CreatorUserId, y.i.value('(./text())[1]', 'int') As MentionedUserId 
    From Src 
    Cross Apply (Select CONVERT(XML, '<i>' + REPLACE(MentionedUserId, ',', '</i><i>') + '</i>').query('.') As x) As a 
    Cross Apply x.nodes('i') As y(i) 
), UserList As (
    Select CreatorUserId As UserId From Normalised Union 
    Select MentionedUserId   From Normalised 
) 
Select UserId, 
    (Select Count(*) From Normalised Where MentionedUserId = UserId) As MentionedUserCount, 
    (Select Count(*) From Src  Where CreatorUserId = UserId) As CreatorUserCount 
From UserList; 
関連する問題