需要从列名基于另一个 table 中的值的列中获取值
Need to get the value from a column whose column name is based on a value in another table
Table A 有列 ID、COL1、COL2、COL3。
Table B 有 AID、ColumnName 列。
我需要根据 Table B 中 [ColumnName] 的值获取 Table A 中的 [ColumnName] 值。
在下面的示例中:
对于 ID 1,我需要获取列 COL1 的值(这是 Table B 中 AID 1 的 [ColumnName] 的值)。
对于 ID 2,我需要获取列 COL3 的值(这是 Table B 中 AID 2 的 [ColumnName] 的值)。
Table一个
ID COL1 COL2 COL3
1 a aa aaa
2 b bb bbb
Table B
AID ColumnName
1 COL1
2 COL3
期望的结果:
ID VALUE
1 a
2 bbb
我该怎么做?
谢谢。
旋转然后加入
drop table t
go
drop table t1
go
create table t
(ID int, COL1 varchar(10), COL2 varchar(10), COL3 varchar(10))
go
create table t1
(AID int,ColumnName varchar(10));
go
insert into t values
(1 , 'a', 'aa', 'aaa'),
(2 , 'b', 'bb', 'bbb')
go
insert into t1 values
(1 , 'COL1'),
(2 , 'COL3')
go
with cte as
(select id, u.col, u.val
from t
unpivot
(
val
for col in (col1, col2, col3)
) u
)
select cte.id,cte.val
from cte
join t1 on
t1.aid = cte.id and
t1.columnname = cte.col
go
id val
----------- ----------
1 a
2 bbb
(2 row(s) affected)
一种可能的方法是使用 VALUES
table 值构造函数和附加的 APPLY
运算符对 TableA
中的列进行逆透视:
表:
SELECT *
INTO TableA
FROM (VALUES
(1, 'a', 'aa', 'aaa'),
(2, 'b', 'bb', 'bbb')
) v (ID, COL1, COL2, COL3)
SELECT *
INTO TableB
FROM (VALUES
(1, 'COL1'),
(2, 'COL3')
) v (AID, COL)
声明:
SELECT b.AID, v.VALUE
FROM TableB b
JOIN TableA a ON b.AID = a.ID
CROSS APPLY (VALUES
('COL1', a.COL1),
('COL2', a.COL2),
('COL3', a.COL3)
) v (COL, [VALUE])
WHERE v.COL = b.COL
结果:
AID
VALUE
1
a
2
bbb
Table A 有列 ID、COL1、COL2、COL3。 Table B 有 AID、ColumnName 列。
我需要根据 Table B 中 [ColumnName] 的值获取 Table A 中的 [ColumnName] 值。 在下面的示例中:
对于 ID 1,我需要获取列 COL1 的值(这是 Table B 中 AID 1 的 [ColumnName] 的值)。
对于 ID 2,我需要获取列 COL3 的值(这是 Table B 中 AID 2 的 [ColumnName] 的值)。
Table一个
ID COL1 COL2 COL3
1 a aa aaa
2 b bb bbb
Table B
AID ColumnName
1 COL1
2 COL3
期望的结果:
ID VALUE
1 a
2 bbb
我该怎么做? 谢谢。
旋转然后加入
drop table t
go
drop table t1
go
create table t
(ID int, COL1 varchar(10), COL2 varchar(10), COL3 varchar(10))
go
create table t1
(AID int,ColumnName varchar(10));
go
insert into t values
(1 , 'a', 'aa', 'aaa'),
(2 , 'b', 'bb', 'bbb')
go
insert into t1 values
(1 , 'COL1'),
(2 , 'COL3')
go
with cte as
(select id, u.col, u.val
from t
unpivot
(
val
for col in (col1, col2, col3)
) u
)
select cte.id,cte.val
from cte
join t1 on
t1.aid = cte.id and
t1.columnname = cte.col
go
id val
----------- ----------
1 a
2 bbb
(2 row(s) affected)
一种可能的方法是使用 VALUES
table 值构造函数和附加的 APPLY
运算符对 TableA
中的列进行逆透视:
表:
SELECT *
INTO TableA
FROM (VALUES
(1, 'a', 'aa', 'aaa'),
(2, 'b', 'bb', 'bbb')
) v (ID, COL1, COL2, COL3)
SELECT *
INTO TableB
FROM (VALUES
(1, 'COL1'),
(2, 'COL3')
) v (AID, COL)
声明:
SELECT b.AID, v.VALUE
FROM TableB b
JOIN TableA a ON b.AID = a.ID
CROSS APPLY (VALUES
('COL1', a.COL1),
('COL2', a.COL2),
('COL3', a.COL3)
) v (COL, [VALUE])
WHERE v.COL = b.COL
结果:
AID | VALUE |
---|---|
1 | a |
2 | bbb |