【发布时间】:2016-12-10 20:44:18
【问题描述】:
我有一个 CASE WHEN 条件(CompanyGUID 和 LineGUID),我需要使用 4 个不同的列进行 4 个不同的计算。 计算工作正常,但我只是想知道有什么办法让它更方便吗?例如,在这种情况下可能使用 COALESCE 技巧?
CASE WHEN dbo.tblCompanyLocations.CompanyGUID = '29634AF7-D0A2-473D-9574-405C23E10F02'
AND dbo.tblQuotes.LineGUID = '1CB72920-B3FC-4822-8030-37B50A2810EB'
THEN isnull(ddaWC.archexMod,1)
END as ExperienceMod,
CASE WHEN dbo.tblCompanyLocations.CompanyGUID = '29634AF7-D0A2-473D-9574-405C23E10F02'
AND dbo.tblQuotes.LineGUID = '1CB72920-B3FC-4822-8030-37B50A2810EB'
THEN case when convert(int,ddawc.premModTtl) <= 0 then 1
when convert(int,ddawc.premModTtl) >= 0
then (1 + ddaWC.premschmod / ddawc.premModTtl) end
END as ScheduleMod,
CASE WHEN dbo.tblCompanyLocations.CompanyGUID = '29634AF7-D0A2-473D-9574-405C23E10F02'
AND dbo.tblQuotes.LineGUID = '1CB72920-B3FC-4822-8030-37B50A2810EB'
THEN isnull(ddaWC.TMpercent,1) END as TerritoryMod,
CASE WHEN dbo.tblCompanyLocations.CompanyGUID = '29634AF7-D0A2-473D-9574-405C23E10F02'
AND dbo.tblQuotes.LineGUID = '1CB72920-B3FC-4822-8030-37B50A2810EB'
THEN case when convert(int,ddaWC.SchedPercent) = 0 or
ddaWC.SchedPercent is not null
then (isnull(ddaWC.archexMod,1)
* (convert(decimal(5,2),isnull(ddaWC.SchedPercent,1))))
* isnull(ddaWC.TMpercent,1)
when ddaWC.SchedPercent is null
then 1 END
END as EffectiveMod
【问题讨论】:
-
更方便是什么意思?不必输入更少的代码?
-
抱歉,我的意思是我可以使用一次(CompanyGUID 和 LineGUID)并因此有 4 个不同的列吗?
-
让我们说更好、更专业的查询方式
-
我在许多生产环境中看到这样的案例陈述,那里没有真正的问题。您可以创建一个映射表并对其进行内部连接(一个表比代码修改更容易维护,让您可以将正在进行的更改转移给可以在表中输入一行而不是修改 sql 代码的人)跨度>
-
你可以去掉一些不必要的逻辑语句,比如在同一个case语句中同时使用
>= 0和<=0。这可以用一个比较和一个其他来代替......
标签: sql sql-server tsql reporting-services sql-server-2012