2017-02-28 50 views
0

嗨,我需要一個複雜的查詢 我的表結構逗號有相同值的列獲取數分隔格式的Sql

attribute_id value entity_id 
188   48,51,94  1 
188   43,22  2 
188   43,22  3 
188   43,22  6 
190   33,11  10 
190   90,61  12 
190   90,61  15 

我需要的價值像

attribute_id value count 
188   48   2 
188   43   3 
188   51   1 
188   94   1 
188   22   2 
190   33   1 
190   11   1 
190   90   2 
190   61   2 

我有計搜索了很多谷歌有這樣的事情,但不幸的是我沒有得到任何成功。請建議我如何實現這一點。

+0

是已知的,固定的可能值的範圍,或可能有任何數量的值出現的? –

+0

不,他們不是固定的,我只能在查詢中傳遞attribute_id值。請建議。 –

+0

千萬不要將數據存儲爲逗號分隔的項目!這隻會導致你很多問題。 – jarlh

回答

0

我對這樣的事情使用UDF。如果這能爲你工作:

CREATE FUNCTION [dbo].[UDF_StringDelimiter] 
/********************************************************* 
** Takes Parameter "LIST" and transforms it for use ** 
** to select individual values or ranges of values. ** 
**              ** 
** EX: 'This,is,a,test' = 'This' 'Is' 'A' 'Test'  ** 
*********************************************************/ 
    (
      @LIST    VARCHAR(8000) 
     ,@DELIMITER  VARCHAR(255) 
    ) 

RETURNS @TABLE TABLE 
    ( 
     [RowID] INT IDENTITY 
     ,[Value] VARCHAR(255) 
    ) 
WITH SCHEMABINDING 
AS 
BEGIN 
    DECLARE 
     @LISTLENGTH AS SMALLINT 
     ,@LISTCURSOR AS SMALLINT 
     ,@VALUE AS VARCHAR(255) 
    ; 
    SELECT 
     @LISTLENGTH = LEN(@LIST) - LEN(REPLACE(@LIST,@DELIMITER,'')) + 1 
     ,@LISTCURSOR = 1 
     ,@VALUE = '' 
    ; 
    WHILE @LISTCURSOR <= @LISTLENGTH 
    BEGIN 

     INSERT INTO @TABLE (Value) 
     SELECT 
      CASE 
       WHEN @LISTCURSOR < @LISTLENGTH 
        THEN SUBSTRING(@LIST,1,PATINDEX('%' + @DELIMITER + '%',@LIST) - 1) 
       ELSE SUBSTRING(@LIST,1,LEN(@LIST)) 
      END 
     ; 
     SET @LIST = STUFF(@LIST,1,PATINDEX('%' + @DELIMITER + '%',@LIST),'') 
     ;  
     SET @LISTCURSOR = @LISTCURSOR + 1 
     ; 
    END 
    ; 
    RETURN 
    ; 
END 
; 

的UDF有兩個參數:要分割的字符串,並且分隔符的分裂。多年來,我一直在使用它來處理各種不同的事情,因爲有時候你需要用逗號分隔,有時候用空格,有時用整個字符串。

一旦你的UDF,你可以這樣做:

DECLARE @TABLE TABLE 
(
    Attribute_ID INT 
    ,Value VARCHAR(55) 
    ,Entity_ID INT 
); 

INSERT INTO @TABLE VALUES (188, '48,51,94', 1); 
INSERT INTO @TABLE VALUES (188, '43,22', 2); 
INSERT INTO @TABLE VALUES (188, '43,22', 3); 
INSERT INTO @TABLE VALUES (188, '43,22', 6); 
INSERT INTO @TABLE VALUES (190, '33,11', 10); 
INSERT INTO @TABLE VALUES (190, '90,61', 12); 
INSERT INTO @TABLE VALUES (190, '90,61', 15); 

SELECT 
    T1.Attribute_ID 
    ,T2.Value 
    ,COUNT(T2.Value) AS Counter 
FROM @TABLE T1 
CROSS APPLY dbo.UDF_StringDelimiter(T1.Value,',') T2 
GROUP BY T1.Attribute_ID,T2.Value 
ORDER BY T1.Attribute_ID ASC, Counter DESC 
; 

我做了一個ORDER BY Attribute_ID上升,然後下降計數器,讓你得到每個Attribute_ID最常見的重複值第一。當然,你可以改變它。

返回此:

Attribute_ID  Value  Counter 
----------------------------------- 
188    43   3 
188    22   3 
188    94   1 
188    48   1 
188    51   1 
190    61   2 
190    90   2 
190    11   1 
190    33   1