ave*_*rry -1 sql t-sql sql-server join case
SQL 服务器 2012
我将收取的费用根据客户成为客户的时间长短乘以不同的因素。该group by条款相当直接。但是,select当我想以不同的方式使用此标准时,我会感到尴尬:
select mp.professionals
,case when sl.stmndate < dateadd(year, 3, m.qClientOpenDate) then 'New' else 'Old' end age -- straight forward
,case (case when sl.stmndate < dateadd(year, 3, m.qClientOpenDate) then 'New' else 'Old' end) -- nested case
when 'New' then sum(fees) * 0.5
when 'Old' then sum(fees) * 0.25
else 0
end Credit
,case (case when sl.stmndate < dateadd(year, 3, m.qClientOpenDate) then 'New' else 'Old' end) -- nested case
when 'New' then 'Welcome!'
when 'Old' then 'Thank you for being a long-time Client!'
end Greeting
from mattersprofessionals mp
inner join matters m on m.matters = mp.matters
inner join stmnledger sl on sl.matters = mp.matters
group by mp.professionals, case when sl.stmndate < dateadd(year, 3, m.qClientOpenDate) then 'New' else 'Old' end
Run Code Online (Sandbox Code Playgroud)
我想我应该提到这是我实际case陈述的简化版本。
我希望有一种方法可以sl.stmndate < dateadd(year, 3, m.qClientOpenDate)作为布尔值或其他东西进行分组,这样我就不必执行嵌套的 case 表达式。
我知道我可以在基本案例上做一个子查询,然后在外部查询中做更多的案例表达式。但这只是重新排列相同的嵌套案例概念。
当直接从行计算值时,我倾向于使用cross apply它,因为它比添加派生表/CTE 更简洁,派生表/CTE 的唯一目的是定义列别名但仍需要投影出剩余的列并包含FROM.
这不是引用窗口函数或聚合函数的表达式的选项,但在这里可以正常工作。
select mp.professionals
,ca.age -- straight forward
,case ca.age -- nested case
when 'New' then sum(fees) * 0.5
when 'Old' then sum(fees) * 0.25
else 0
end Credit
,case ca.age -- nested case
when 'New' then 'Welcome!'
when 'Old' then 'Thank you for being a long-time Client!'
end Greeting
from mattersprofessionals mp
inner join matters m on m.matters = mp.matters
inner join stmnledger sl on sl.matters = mp.matters
cross apply (select case when sl.stmndate < dateadd(year, 3, m.qClientOpenDate) then 'New' else 'Old' end) ca(age)
group by mp.professionals, ca.age
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |