1
假設有5列,我想比較一行中的所有字符串並給出每個字符串的計數。在這種情況下,SQL查詢或存儲過程應該是什麼?我想要一個動態查詢SQL查詢/存儲過程
Column 1- xyz,vbn Column2- xyzz Column3- xyzz,vbn Column4-xyz Column5- xyzz,vbn
Result: xyz-2 vbn-3 xyzz-3
假設有5列,我想比較一行中的所有字符串並給出每個字符串的計數。在這種情況下,SQL查詢或存儲過程應該是什麼?我想要一個動態查詢SQL查詢/存儲過程
Column 1- xyz,vbn Column2- xyzz Column3- xyzz,vbn Column4-xyz Column5- xyzz,vbn
Result: xyz-2 vbn-3 xyzz-3
假設你的數據結構如下:
這是我如何將接近這一點使用TSQL:
樣本數據:
IF OBJECT_ID('tempdb..#Temp2') IS NOT NULL
DROP TABLE #Temp2
CREATE TABLE #Temp2
(Column1 VARCHAR(10),
Column2 VARCHAR(10),
Column3 VARCHAR(10),
Column4 VARCHAR(10),
Column5 VARCHAR(10)
);
INSERT INTO #Temp2
VALUES
('xyz ', 'xyzz', 'xyzz ', 'xyz', 'xyzz '),
('vbn', NULL, 'vbn', NULL, 'vbn');
查詢:
SELECT
Val+'-'+CAST(Cnt AS varchar) AS Results
FROM
#Temp2 T
CROSS APPLY (
SELECT Val, Count(*)
FROM (VALUES (Column1), (Column2), (Column3), (Column4), (Column5)) C (Val)
GROUP BY Val
) A (Val,Cnt)
WHERE Val IS NOT NULL
結果:
但是,如果你的數據結構如下圖所示:
的過程是一個比較複雜。
首先,您需要使用您需要創建看樣品here一個函數來分割字符串:
我選擇了XML功能:
CREATE FUNCTION dbo.SplitStrings_XML
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
);
GO
的,你可以接近它像這樣:
樣本數據:
IF OBJECT_ID('tempdb..#Temp') IS NOT NULL
DROP TABLE #Temp;
CREATE TABLE #Temp
(Column1 VARCHAR(10),
Column2 VARCHAR(10),
Column3 VARCHAR(10),
Column4 VARCHAR(10),
Column5 VARCHAR(10)
);
INSERT INTO #Temp
VALUES
('xyz,vbn', 'xyzz', 'xyzz,vbn', 'xyz', 'xyzz,vbn');
查詢:
SELECT Item+'-'+CAST(COUNT(1) AS VARCHAR) AS Result
FROM [dbo].[SplitStrings_XML]
(
(
SELECT t.Column1+','+t.Column2+','+t.Column3+','+t.Column4+','+t.Column5
FROM #Temp AS t
), ','
)
GROUP BY Item;
結果:
感謝@KamranFarzami –