sql - 计算两个表中行之间的重合次数

标签 sql sql-server t-sql sql-server-2014

我正在尝试在 SQL Server 2014 中编写一个查询,该查询将两个表中的行之间的重合次数(但只是当这些重合大于 1 时)计算到一个新列中。结构是这样的:

table_a:
================
c1 | c2 | c3 | c4

11 | 30 | 70 | 90
20 | 80 | 95 | 99
15 | 39 | 40 | 41
...

table_b:
================
n1 | n2 | n3 | n4

30 | 65 | 90 | 95
20 | 80 | 90 | 99
15 | 80 | 95 | 99
...

我想在查询中在 table_a 中的列之后添加一列,如下所示:

query:
================
c1 | c2 | c3 | c4 | c5

11 | 30 | 70 | 90 | 2
20 | 80 | 95 | 99 | 6
15 | 39 | 40 | 41 | 0
...

换句话说,对于 table_a 中的每一行,检查有多少个数字与 table_b 中的每一行匹配,然后将所有大于 1 的结果相加,然后粘贴到该行旁边表_a

我有以下代码,但输出错误:

SELECT TOP (100) PERCENT dbo.table_a.c1, dbo.table_a.c2,  
    dbo.table_a.c3, dbo.table_a.c4, dbo.table_a.c5, dbo.table_a.c6,  
    COUNT('c1 = n1 or n2 or n3 or  n4 or  n5 or  n6')  
    + COUNT('c2 = n1 or n2 or n3 or n4 or  n5 or  n6')  
    + COUNT('c3 = n1 or n2 or n3 or  n4 or  n5 or  n6')  
    + COUNT('c4 = n1 or n2 or n3 or  n4 or  n5 or  n6')  
    + COUNT('c5 = n1 or n2 or n3 or  n4 or  n5 or  n6')  
    + COUNT('c6 = n1 or n2 or n3 or  n4 or  n5 or  n6') AS c5  
FROM  dbo.table_a CROSS JOIN dbo.[table_b]  
GROUP BY dbo.table_a.c1, dbo.table_a.c2, dbo.table_a.c3, dbo.table_a.c4,  
  dbo.table_a.c5, dbo.table_a.c6  
HAVING   (COUNT('c1 = n1 or n2 or n3 or  n4 or  n5 or  n6')  
    + COUNT('c2 = n1 or n2 or n3 or  n4 or  n5 or  n6')  
    + COUNT('c3 = n1 or n2 or n3 or  n4 or  n5 or  n6')  
    + COUNT('c4 = n1 or n2 or n3 or  n4 or  n5 or  n6')  
    + COUNT('c5 = n1 or n2 or n3 or  n4 or  n5 or  n6')   
    + COUNT('c6 = n1 or n2 or n3 or  n4 or  n5 or  n6') > 1)
ORDER BY c5 DESC    

如有任何帮助,我们将不胜感激,谢谢!

最佳答案

;with cte(n) as(
    select n1 from table_b union all
    select n2 from table_b union all
    select n3 from table_b union all
    select n4 from table_b
)
,counted(n, c) as(
    select n, c = count(n) from cte group by n
)
select
    a.*, b.cc
from table_a a
cross apply(
    select cc = sum(case when c > 1 then c else 0 end)
    from counted
    where
        n = a.c1
        or n = a.c2
        or n = a.c3
        or n = a.c4
)b

关于sql - 计算两个表中行之间的重合次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27436128/

相关文章:

c++ - MFC ODBC SQLConfigDataSource() 未处理的异常

MySQL查询获取相关表的最后4条记录

c# - 返回受每个 INSERT 上的存储过程影响的行以显示在 ASP.NET 页面中

sql-server - django.db.utils.InterfaceError : ('IM002' , '[IM002] [Microsoft][ODBC 驱动程序管理器] 未找到数据源名称且未指定默认驱动程序 (0))

sql - 什么公式用于在基于标签的系统中构建相关项目列表?

sql - 是否可以在不使用游标的情况下对集合执行存储过程?

c# - 如何自动设置 DateCreated 和 DateUpdated

sql-server - SQL Server 中有用的非系统过程

sql-server - SQL 从第一个表中选择行并更新到第二个表

sql - TSQL使EXECUTE语句同步