用“over partition by”选择case

时间:2015-09-14 07:41:32

标签: sql sql-server tsql sql-server-2012 window-functions

正确的语法是什么,或者可以在select和in分区中使用case? (使用sql server 2012)

a = unique id
b = a string'xf%'
c = values
d = values 
e = values



select 
    case 
    when b like 'xf%' then
    (sum(c*e)/100*3423 over (partition by a))end as sumProduct
from #myTable

这是我需要解决的问题,这是我遇到的问题的一部分 以前sumProduct in sql

编辑:根据要求添加一些示例数据和预期结果 create table #testing(b varchar(20),date,c int,e int)

     b           a           c         e       sumProduct (expected)
    xf1m    2015.03.02       1         3       (1*3 + 2*5 + 4*2 +3*6)*100/3423
    xf3m    2015.03.02       2         5       (1*3 + 2*5 + 4*2 +3*6)/100*3423
    xf5y    2015.03.02       4         2       (1*3 + 2*5 + 4*2 +3*6)/100*3423
    xf10y   2015.03.02       3         6       (1*3 + 2*5 + 4*2 +3*6)/100*3423
    adfe    2015.03.02       2         5    ---this is skipped because is not xf%
    xf1m    2013.02.01       7         2        (7*2 + 1*8 + 10*1)/100*3423
    xf15y   2013.02.01       1         8        (7*2 + 1*8 + 10*1)/100*3423
    xf20y   2013.02.01       10        1        (7*2 + 1*8 + 10*1)/100*3423

我看到问题是这样的:即使它们不符合标准,东西也会被加起来。在我的小提琴中你可以看到sumProduct的结果是49而不是39,因为adfe的2 * 5正在被添加。我该怎么办?

create table #testing (b varchar (20), a date, c int, e int)

insert into #testing (b,a,c,e)
values
('xf1m','2015-03-02','1','3'),
('xf3m','2015-03-02','2','5'),
('xf5y','2015-03-02','4','2'),
('xf10y','2015-03-02','3','6'),
('adfe','2015-03-02','2','5'),
('xf1m','2013-02-01','7','2'),
('xf15y','2013-02-01','1','8'),
('xf20y','2013-02-01','10','1')

编辑:找到解决方案,将其写为下面的答案

2 个答案:

答案 0 :(得分:3)

你不能将中的任意表达式放在 Aggregate() OVER (PARTITION clause)表达式中 - 所以将其他计算移到外面:

select 
    case 
    when b like 'xf%' then
    (sum(c*e) over (partition by a))/100*3423 end as sumProduct
from #myTable

答案 1 :(得分:0)

找到我在编辑中询问的解决方案:

 select
 b,
 a,
 c,
 e,
case 
when b like 'xf%' then -- 
(sum(c * e) over (partition by a ))/*/3*10*/ end as sumProduct
into #testing2
from #testing
where (b like 'xf%')

select t1.b, t1.a,t1.c,t1.e,t2.sumProduct 
from #testing t1
left join #testing2 t2 on t1.a = t2.a and t2.b = t1.b
order by t1.a, t1.b