sql - 如何动态化另一个表中的列别名

标签 sql sql-server t-sql

我有以下查询,我正在寻找动态化另一个表中的列名称标签。 在表 #Tmp2 中,Dim1 的变化取决于 Dim1.Num,例如我可以有 对于 Dim1.Num = 1 => Dim1 =BusinessUnit
在其他情况下,我可以有 Dim1.Num = 1 => Dim1 =Department

SELECT Dim1.Dim1 ,Dim1.ValueDim1  ,
       Dim2.Dim2 ,Dim2.ValueDim2  ,
       #Tmp1.Amount

INTO   #Tmp3

FROM   #Tmp1

INNER JOIN #Tmp2 as Dim1 on Dim1.id = #Tmp1.id And Dim1.Num=1
INNER JOIN #Tmp2 as Dim2 on Dim1.id = #Tmp1.id And Dim2.Num=2

这是结果:

Dim1            ValueDim1  Dim2         ValueDim2  Amount
BusinessUnit    002        Department   027        1000

但我想要这个结果

BusinessUnit    ValueDim1  Department   ValueDim2  Amount
BusinessUnit    002        Department   027        1000

也就是说,根据#Tmp2.Num的值,列的适用名称可以更改。

也许是这样的

SELECT Dim1.Dim1 AS (select Dim from #Tmp2 where #Tmp2.Num = 1)

最佳答案

您可以使用动态 SQL:

DECLARE @ColName VARCHAR(20) = (select Dim from #Tmp2 where #Tmp2.Num = 1)

EXEC('SELECT Dim1.Dim1 ['+@ColName+'] ,Dim1.ValueDim1  ,
       Dim2.Dim2 ,Dim2.ValueDim2  ,
       #Tmp1.Amount

INTO   #Tmp3

FROM   #Tmp1

INNER JOIN #Tmp2 as Dim1 on Dim1.id = #Tmp1.id And Dim1.Num=1
INNER JOIN #Tmp2 as Dim2 on Dim1.id = #Tmp1.id And Dim2.Num=2')

此操作(以及您的一般问题)的限制是,如果您的 #Tmp2 有两条具有相同 Num 的记录,则查询将抛出 子查询返回多个值错误。解决这个问题的唯一方法是更改​​您的 @ColName 查询,使其只返回单个值:

DECLARE @ColName VARCHAR(20) = (select TOP 1 Dim from #Tmp2 where #Tmp2.Num = 1)

更新:

如果您获取列名的查询可能返回 0 条记录,则按如下方式修改您的查询:

DECLARE @ColName VARCHAR(20) = (
    select Dim from #Tmp2 where #Tmp2.Num = 1 
    UNION 
    SELECT 'DefaultValue' WHERE NOT EXISTS (select Dim from #Tmp2 where #Tmp2.Num = 1)
    )

但是,如果您的查询返回一条记录,但要用作列名称的列中的值为空,则按如下方式修改查询:

DECLARE @ColName VARCHAR(20) = (select ISNULL(Dim,'DefaultValue') from #Tmp2 where #Tmp2.Num = 1)

关于sql - 如何动态化另一个表中的列别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34809751/

相关文章:

sql - 内连接转换失败

sql - 只查找所有行颜色都相同的 ID

mysql - 查询建立带内连接的临时表

mysql - 如何修改此 SQL 查询

sql - 如何减小空间索引数据的大小

c# - Entity Framework 错误的外键顺序

c# - Linq to SQL DateTime 值是本地的 (Kind=Unspecified) - 如何使其成为 UTC?

sql - 如何从选择查询中删除项目?

java - PHP 从数据库中检索单个字符串

sql - 使用 SQL 计算足球联赛积分榜