2015-06-22 65 views
-1

IM在SQL 2008工作 即時通訊做一個SP 和它應該看起來像: 我有輸入參數,@T NVARCHAR(255) 例如它得到4個字符: 'A,B,C,d' 我需要統計倍字符出現在同一個詞 但不同勢組合:sql dynamic func - 如何使它工作?

Count (a) 
Count (b) 
Count (c) 
Count (d) 
Count (a+b) 
Count (a+c) 
Count (a+d) 
Count (b+c) 
Count (b+d) 
Count (a+b+c+d) --means a+b+c in the same word 
Count (b+c+d) 
Count (c+d) 

它必須是動態的,因爲不知道該輸入。 我可以解決它,但我需要幫助,我如何使所有可能的組合動態?輸入可以是10個字符長。 可能有什麼方法或什麼? 感謝您的幫助!

+0

期望的結果是什麼? –

+0

它應該是這樣的: 組合量 b 9分配 A + B 7 A + B + C 6 等..... –

+0

仍不清楚,你能包括一些示例數據和預期的結果?請包括在問題中。 –

回答

0

嘗試這樣:

DECLARE @Words TABLE (Word VARCHAR(20) PRIMARY KEY) 
INSERT INTO @Words (Word) VALUES ('Adam'), ('John'), ('Alex'), ('Bob'), ('Barbara'),('Cabral') 

DECLARE @Letters VARCHAR(10) 
SET @Letters='ABCD' 

DECLARE @Numbers TABLE(N INT PRIMARY KEY) 
INSERT INTO @Numbers (N) VALUES (1) 
WHILE @@ROWCOUNT<512 
INSERT INTO @Numbers (N) 
SELECT N+(SELECT COUNT(*) FROM @Numbers) FROM @Numbers 

DECLARE @Combinations TABLE (N INT PRIMARY KEY, SelectedLetters VARCHAR(10)) 
INSERT INTO @Combinations (N, SelectedLetters) 
SELECT *, (
    SELECT SUBSTRING(@Letters,N2.N,1) AS '*' 
    FROM @Numbers N2 
    WHERE N2.N<=LEN(@Letters) 
    AND N1.N & POWER(2,N2.N-1)<>0 
    FOR XML PATH(''), TYPE 
).value('.','varchar(10)') AS SelectedLetters 
FROM @Numbers N1 
WHERE N1.N<POWER(2,LEN(@Letters)) 
ORDER BY 1,2 

DECLARE @AllCounts TABLE (
    Word VARCHAR(20) NOT NULL, 
    N INT NOT NULL, 
    PRIMARY KEY (Word,N), 
    SelectedLetters VARCHAR(10) NOT NULL, 
    Cnt INT NOT NULL 
) 

INSERT INTO @AllCounts 
SELECT W.Word, C.N, C.SelectedLetters, X.Cnt 
FROM @Words W 
CROSS JOIN @Combinations C 
CROSS APPLY (
    SELECT COUNT(*) AS Cnt 
    FROM @Numbers N 
    WHERE SUBSTRING(W.Word,N,1) LIKE '%['+c.SelectedLetters+']%' 
) X 
WHERE X.Cnt>0 
ORDER BY 1,2 

SELECT * FROM @AllCounts A1 
WHERE NOT EXISTS (
    SELECT * FROM @AllCounts A2 
    WHERE A1.Word=A2.Word 
    AND A1.N<>A2.N 
    AND A1.N | A2.N = A1.N 
    AND A1.Cnt=A2.Cnt 
) 

的@Combinations表存儲了所有可能的字母組合。 我們計算每個單詞到@AllCounts表中的計數。最後,我們只顯示相關計數。

+0

謝謝,生病嘗試! –