2014-01-19 52 views
1

好吧,我有兩張桌子。表1有一個參考編號列(A),第二列有一串隨機性(B)。表2只有一列,其中可能包含或不包含Table1中字符串的值列表。查詢返回字符串中特定值出現的次數?

dbo.Tbl_1

+--+---------------------------------------+ 
|A |B          | 
+--+---------------------------------------+ 
|24|BLUE; KITTEN; WHITE; PINK; SLOPE; GREEN| 
+--+---------------------------------------+ 
|51|GREEN; CLOUDY; WHITE; CHIPS   | 
+--+---------------------------------------+ 
|78|PATRIOTS; PINK; PINK; WHITE   | 
+--+---------------------------------------+ 
|22|WHITE; RED; TREES; AMY; GREEN   | 
+--+---------------------------------------+ 

dbo.Tbl_2

+-----+ 
|C | 
+-----+ 
|BLUE | 
+-----+ 
|WHITE| 
+-----+ 
|PINK | 
+-----+ 
|BROWN| 
+-----+ 

哪些SQL查詢將確定有多少次從表2的值是在表1的字符串中發現了什麼?基本上我想返回下面的結果集:

+-----+----+ 
|BLUE |1 | 
+-----+----+ 
|WHITE|4 | 
+-----+----+ 
|PINK |3 | 
+-----+----+ 
|BROWN|NULL| 
+-----+----+ 

供參考:實際上,表2有大約200個獨特的記錄。表1有大約160萬條具有唯一參考號的記錄。這兩個表都不是靜態的。

+0

在tbl 1 col B中總是隻有一種顏色的實例嗎?即在tbl 1 id 24不可能在同一記錄上有兩次BLUE – johnnyarguelles

+1

而不是問「我如何做X」,你應該自己嘗試一些查詢,並告訴我們你已經嘗試過什麼,具體是什麼加工。 –

+0

對不起Tim!謝謝你讓我知道! –

回答

0

我打了一下週圍,並用此SQL fiddle

相關SELECT查詢看起來像這樣來到了(需要兩個表,雖然掃描,我敢肯定,它可以製成更有效):

select C, sum(dbo.CountOccurancesOfString(B, C)) as number 
from Tbl_1 join Tbl_2 on 1=1 
group by C 
order by number desc 

編輯這是我從this answer得到了功能:

CREATE FUNCTION dbo.CountOccurancesOfString 
(
@searchString nvarchar(max), 
@searchTerm nvarchar(max) 
) 
RETURNS INT 
AS 
BEGIN 
return (LEN(@searchString)-LEN(REPLACE(@searchString,@searchTerm,'')))/LEN(@searchTerm) 
END 
+0

只有在Tbl_2中的所有值都不是**表中其他項目的子字符串時,此解決方案纔會有效。例如,** GREEN vs. LIGHTGREEN **(在這種情況下'GREEN'會被重複計數)。 – wdosanjos

+0

謝謝!這工作得很好,以及! –

+0

wdosanjos - 你當然是對的。我認爲M.Ali的分裂方法更好,因爲countoccurrences函數將不得不徹底改變。 –

0

拆分功能

CREATE FUNCTION [dbo].[udf_Split] 
(
    @RowData nvarchar(2000), 
    @SplitOn nvarchar(5) 
) 
RETURNS @RtnValue table 
(
    Id int identity(1,1), 
    Data nvarchar(100) 
) 
AS 
BEGIN 
    Declare @Cnt int 
    Set @Cnt = 1 

    While (Charindex(@SplitOn,@RowData)>0) 
    Begin 
     Insert Into @RtnValue (data) 
     Select 
      Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1))) 

     Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData)) 
     Set @Cnt = @Cnt + 1 
    End 

    Insert Into @RtnValue (data) 
    Select Data = ltrim(rtrim(@RowData)) 

    Return 
END 

您的數據

DECLARE @Table_1 TABLE ([A] INT,[B] VARCHAR(1000)) 
INSERT INTO @Table_1 VALUES 
(24,'BLUE; KITTEN; WHITE; PINK; SLOPE; GREEN'), 
(51,'GREEN; CLOUDY; WHITE; CHIPS'), 
(78,'PATRIOTS; PINK; PINK; WHITE'), 
(22,'WHITE; RED; TREES; AMY; GREEN') 

DECLARE @Table_2 TABLE (ColumnName VARCHAR(100)) 
INSERT INTO @Table_2 VALUES 
('BLUE'),('WHITE'),('PINK'),('BROWN') 

查詢

SELECT T2.ColumnName, TotalNums 
FROM 
(SELECT Data, COUNT(DATA) TotalNums 
FROM @Table_1 t CROSS APPLY (SELECT * FROM [dbo].[udf_Split](t.B, ';'))C 
GROUP BY Data) T1 
RIGHT JOIN @Table_2 T2 
ON T1.Data = T2.ColumnName 

結果集

╔════════════╦═══════════╗ 
║ ColumnName ║ TotalNums ║ 
╠════════════╬═══════════╣ 
║ BLUE  ║ 1   ║ 
║ WHITE  ║ 4   ║ 
║ PINK  ║ 3   ║ 
║ BROWN  ║ NULL  ║ 
╚════════════╩═══════════╝ 
+0

謝謝!成功了! –

相關問題