有没有一种方法可以使用SQL将字符串转换为列名?

时间:2019-12-11 21:55:11

标签: sql tsql

我需要根据辅助表中列出的规则对某些列执行一些数学运算。

一些示例数据。

HoursWorked   HoursEarned   Earnings1   Earnings2   Earnings3   Earnings4
40            55            120         60          60          80
30            40            160         40          50          90
20            48            130         70          90          120

在一个易于使用LEFT OUTER JOIN的单独表中,我还将需要制定这样的规则。

ThingDesc1   ThingVal1   ThingRule1   ThingBasedOn1   ThingDesc2   ThingVal2   ThingRule2   ThingBasedOn2   ThingDesc3   ThingVal3   ThingRule3   ThingBasedOn3
Working      .03         W            NULL            Earning      1.03        E            NULL            Percentage   2.5         P            E1-E2,E4

输出需要看起来像这样。

HoursWorked   HoursEarned   Earnings1   Earnings2   Earnings3   Earnings4   Working   Earning   Percentage
40            55            120         60          60          80          1.2       56.65     6.5
30            40            160         40          50          90          0.9       41.20     7.25
20            48            130         70          90          120         0.6       49.44     8

假设我正确地执行了此操作,EW规则非常容易遵循,因为它们只是HoursWorked * ThingVal1和HoursEarned * ThingVal2。

但是,由于特殊的“ ThingBasedOn”规则仅使用第一张表的一部分,因此它在“百分比”规则中超出了我的视线。

我制作此通用代码的最初一点就是这样。

--Working
CASE
START
WHEN [ThingRule1] = 'W' THEN [HoursWorked] * [ThingVal1]
WHEN [ThingRule1] = 'E' THEN [HoursEarned] * [ThingVal1]
WHEN [ThingRule1] = 'P' THEN [ThingVal1] * 0.01 * 
    (CONVERT_[ThingBasedOn1]_TO_USABLE_COLUMNS)
ELSE 'Something Went Wrong'
END AS 'Working'

根据需要重复其他规则。 CONVERT_[ThingBasedOn1]_TO_USABLE_COLUMNS会变成[Earnings1]+[Earnings2]+[Earnings3]的地方。

因此,当前的问题是[ThingBasedOn]列值,根据以下规则,该列值将/可以是字符串。

逗号分隔的值表示一列,破折号的值表示列的范围。

例如E1-E8,E13,E15用于E1至E8列以及E13和E15列。

另一列E5,E6,E7用于E5,E6和E7列。

最后E1-E3列E1至E3。

牢记所有这些,将此字符串值转换为可用列的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

首先创建一个临时表来保存列名(Earnings1,Earnings2 ..)及其 ID (E1,E2..etc)的数据。 然后使用条件条件为 ThingBasedOn3

的where子句创建一个带有计算数据的查询

类似-

create table #temp
(
    id int,
    colName varchar(100)
)
insert into #temp
values (1,'a'),(2,'b'), (3,'c'), (4,'d')

DECLARE @strName VARCHAR(100) 
SELECT @strName = 'TestID-' +  colName from #temp where id = 2
DECLARE @sql NVARCHAR(MAX) 
SET @sql = 'select COLUMN_NAME as ' + QUOTENAME(@strName) + ' from TABLE_NAME' 
PRINT @sql 
EXEC(@sql)
drop table #temp