2017-05-25 214 views
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 

回答

0

假设你的数据结构如下:

enter image description here

这是我如何将接近这一点使用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 

结果:

enter image description here

但是,如果你的数据结构如下图所示:

enter image description here

的过程是一个比较复杂。

首先,您需要使用您需要创建看样品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; 

结果:

enter image description here

+0

感谢@KamranFarzami –