繁体   English   中英

如何计算4列中的出现次数

[英]How to count the number of occurrence in 4 columns

我有一个 T-SQL 查询要尽可能以最有效的方式进行。

这是我的表的示例:

一个 C D
1 x, y z NULL NULL
2 X NULL NULL 是的
3 是的 z NULL NULL
4 一个 NULL b X

现在,我需要进行查询以对我的最佳匹配记录进行分类。 假设我需要将匹配更多值“x”和“y”(可能超过 2 个值)的前 3 条记录放入列 B、C、D、E

一个 匹配次数 评论
1 2 因为 B 列包含 x, y
2 2 因为 B 列包含 x 而 E 列包含 y
3 1 因为 B 列包含 y
4 1 因为 E 列包含 x

你能帮我找到一个很好的方法来做这个查询吗?

我强烈建议您更改数据的存储方式,存储分隔字符串以记录多个值是灾难的根源。 如果您有一对多关系,请使用带有主表外键的子表。 很少有理由像这样存储分隔数据,当您必须查询和操作它时,您会意识到为什么不建议这样做。

假设您的每一列都是相同的并且可以包含许多值,您需要拆分所有列,您可以使用以下方法进行操作:

SELECT  t.A, upvt.Col, Value = TRIM(ss.value)
FROM    #T AS t
        CROSS APPLY (VALUES ('B', t.B), ('C', t.C), ('D', t.D), ('E', t.E)) upvt (Col, Value)
        CROSS APPLY STRING_SPLIT(upvt.Value, ',') AS ss;

这使:

一个 科尔 价值
1 X
1 是的
1 C z
2 X
2 是的
3 是的
3 C z
4 一个
4 D b
4 X

有了这些标准化数据,您就可以执行一个简单的WHERE Value IN ('x', 'y')以及GROUP BYCOUNT(*)

IF OBJECT_ID(N'tempdb..#T ', 'U') IS NOT NULL
    DROP TABLE #T ;

CREATE TABLE #T (A INT, B VARCHAR(4), C VARCHAR(4), D VARCHAR(4), E VARCHAR(4));

INSERT #T(A, B, C, D, E)
VALUES
    (1, 'x, y', 'z', NULL, NULL),
    (2, 'x', NULL, NULL, 'y'),
    (3, 'y', 'z', NULL, NULL),
    (4, 'a', NULL, 'b', 'x');

SELECT  t.A, NumberOfMatches = COUNT(*)
FROM    #T AS t
        CROSS APPLY (VALUES (t.B), (t.C), (t.D), (t.E)) upvt (Value)
        CROSS APPLY STRING_SPLIT(upvt.Value, ',') AS ss
WHERE   TRIM(ss.value) IN ('x', 'y')
GROUP BY t.A
ORDER BY COUNT(*) DESC, t.A;

如果您无法规范化 model 您可以使用此查询来获得您的预期结果:

select a, count(*) numberOfMatches,
concat('Because column ', string_agg(columnName, ', ')) AS comment
from (
    select a, columnName, trim(value) targetValue from (
        select a, columnName, value result
        from tbl unpivot (value for columnName in ([B], [C], [D], [E])) up
    ) t 
    outer apply string_split(result,',') 
) r 
where targetValue in ('x','y')
group by a

-- Result
/*
a   numberOfMatches comment
1   2               Because column B, B
2   2               Because column B, E
3   1               Because column B
4   1               Because column E
*/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM