sql - 如何在 SQL 中进行列搜索

标签 sql sql-server t-sql unpivot lateral-join

我有两个表,姓名表和收入表。

<表类=“s-表”> <标题> Name_ID Name_desc <正文> 1 标记 2 史密斯 3 贝基 4 吉米

和 yield 表

<表类=“s-表”> <标题> ID_1 收入_1 ID_2 收入_2 ID_3 收入_3 ID_4 Earnings_4 <正文> 1 500 2 5454 3 1247 4 7844

您可以在这里尝试一下:

https://dbfiddle.uk/d3a3rfG0

问题:如何加入Name_ID和ID_来获得收入。我需要一个函数来检查收入表中的每个 ID 列,如果匹配则获取收入。

目标是一个如下所示的表格:

<表类=“s-表”> <标题> Name_ID Name_desc 收入 <正文> 1 标记 500 2 史密斯 5454 3 贝基 1247 4 吉米 7844

最佳答案

我建议首先在横向联接中取消收入表的透视,这样我们就可以轻松地将其与名称联接起来,并进行聚合:

select n.name_id, n.name_desc, sum(x.earnings) earnings
from earnings e
cross apply ( values 
    (e.id_1, e.earnings_1),
    (e.id_2, e.earnings_2),
    (e.id_3, e.earnings_3),
    (e.id_4, e.earnings_4)
) as x(id, earnings)
inner join names n on n.name_id = x.id
group by n.name_id, n.name_desc
order by n.name_id

此方法的优点是它仅扫描表一次,而不是多次 left joinunion s,因此它应该执行更高效并且扩展性更好。

<强> Demo on DB Fiddle

<表类=“s-表”> <标题> name_id name_desc 收入 <正文> 1 标记 500 2 史密斯 5454 3 贝基 1247 4 吉米 7844

关于sql - 如何在 SQL 中进行列搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75702983/

相关文章:

sql - 根据条件获取列的总和

sql - 选择$(美元符号)

sql - 像列 2 一样在列 1 上内连接两个表,后跟非字母表

sql-server - 一列的值不能大于另一列的值

mysql - 复杂的mysql ORDER BY

SQL:根据其他列中的多个条件对一列中的不同值进行计数

sql - 计算字符串中嵌入的总文件名和唯一文件名

SQL给定多个阈值,获取低于每个阈值的最大值

sql - T-SQL - 根据周数获取开始和结束日期。

linq - 将 SQL 子选择转换为 LINQ