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 –