嗨,我需要一个复杂的查询 我的表结构是
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
我在谷歌上搜索了很多类似的东西,但不幸的是我没有获得任何成功。请建议我如何实现这一目标。
最佳答案
我使用 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 升序,然后 Counter 降序,以便您首先获得具有最常见重复值的每个 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
关于mysql - 获取以逗号分隔格式 Sql 具有相同值的列数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42503021/