SQL:将列值链接到列名以满足某些条件

Posted

技术标签:

【中文标题】SQL:将列值链接到列名以满足某些条件【英文标题】:SQL: Linking Column Value to Column Name to fulfill some conditions 【发布时间】:2021-12-02 16:21:40 【问题描述】:

Tables

根据图片,TABLE B 是我的主表,而 TABLE A 是 TABLE B 的规则或条件。

我想编写一个查询,当表 A 中的规则 1 代表具有指示符 3 的列 [C1] 时。 然后在表 B 中找到具有相应值的相应列名并替换 FILL 值。我想要的结果就像 TABLE C。

我该怎么做?

【问题讨论】:

我不明白 - 为什么只有第 2 行和第 3 行得到更新的填充? 因为第 2 行在 c1 中有 3 个在 c2 中有 6 个满足表 A 中的指标。 【参考方案1】:

您只需要基于两列上的OR 条件加入

最好与MAX 聚合,以防有多个匹配项

SELECT
  b.c1,
  b.c2,
  ISNULL(a.fill, b.fill) AS fill
FROM TableB b
OUTER APPLY (
    SELECT MAX(fill) AS fill
    FROM TableA a
    WHERE a.[column] = 'c1' AND b.c1 = a.ind
       OR a.[column] = 'c2' AND b.c2 = a.ind
) a;

【讨论】:

【参考方案2】:

您可以使用pivot 实现此目的。将表 A 中的列名从行更改为列。

select B.c1,B.c2, (CASE WHEN A.ind IS NULL THEN 0 ELSE 1 END) AS fill
from tblB AS B
left outer join
(select *
from 
(
  select [column], ind, fill
  from tblA 
) src
pivot
(
  max(fill)
  for [column] in ([c1], [c2])
) piv
) AS A
ON (B.c1 = A.ind or B.c2 = A.ind)

【讨论】:

以上是关于SQL:将列值链接到列名以满足某些条件的主要内容,如果未能解决你的问题,请参考以下文章

如何将列值分隔为列名?

SQLServer如何修改一列的列名呢?

SQLServer如何修改一列的列名呢?

如何将 SQL 中的列中的值 PIVOT 到新的列名中,然后在这些 PIVOT 列下列出其他列值?

MySQL选择满足特定行条件的所有列名

SQL条件表达式