我需要根据辅助表中列出的规则对某些列执行一些数学运算。
一些示例数据。
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
假设我正确地执行了此操作,E
和W
规则非常容易遵循,因为它们只是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。
牢记所有这些,将此字符串值转换为可用列的最佳方法是什么?
答案 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