[英]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 BY
和COUNT(*)
:
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.