2016-05-04 11 views
0

Ich habe eine Tabelle mit zwei Spalten MentionedUserIds (nvarchar) und CreatedUserId (int).Count Ids nach Vorkommen von verschiedenen Spalten in SQL Server

Ich möchte die Vorkommen von jedem der Benutzer zählen.

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

Ich brauche das Ergebnis wie folgt aus:

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

Die Anwender in einer anderen Tabelle gespeichert sind.

+1

** Tipp: ** tun ** NICHT ** speichern mehrere Werte in einer einzigen Spalte - das ist ein schrecklich schlechtes Design ** und verletzt sogar die erste normale Form des Datenbankdesigns. Verwenden Sie geeignete relationale Konstrukte und speichern Sie * höchstens einen * Wert pro Spalte. –

+0

Warum 'UserId'' 12' ist '0' in' MentionedUserCount'? –

+0

Sorry, es sollte 1. Danke sein –

Antwort

0

Die Frage ist trivial, sobald die Daten normalisiert sind. Dies kann durch eine beliebige Anzahl von functions or tricks erfolgen.

Mit Microsoft Volltextsuche zur Verfügung:

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; 

Durch XML-Trick:

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;