mysql - 获取以逗号分隔格式 Sql 具有相同值的列数

标签 mysql sql database count group-by

嗨,我需要一个复杂的查询 我的表结构是

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/

相关文章:

mysql - Sequelize - 嵌套 'include' 语句中的 Where 子句确实在 Node 中正确返回结果

mysql - PDO 语法错误,SQLSTATE[42000]

PHP/MySQL : CAST/CASE if row + '_remove' exists then don't select

sql - 使用 case 语句检查 SQL 表中是否存在记录

mysql - SQL 将行信息合并/转换为列

php - JavaScript 通过 POST 提交 HTML 表单

php - MySQL:将唯一列分组到它自己的结果数组中

SQL Select Distinct 与条件

sql - 在 T SQL 中向日期添加月份

database - 数据库管理系统 : Relational Algebra Execution Plan Cost Calculation