select 案例"over partition by"
select case with "over partition by"
正确的语法是什么,或者是否可以在 select 中使用 case 并在其中进行分区? (使用 sql 服务器 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
这是我需要解决的问题,这是我遇到的问题的一部分
以前
编辑:根据要求添加一些示例数据和预期结果
create table #testing (b varchar (20), a 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
我看到问题是这样的:即使不符合标准,也会添加东西。在我的 fiddle 中,您可以看到 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')
编辑:找到解决方案,写在下面作为答案
您不能将任意表达式 放在 中 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
找到了我在编辑中提出的问题的解决方案:
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
正确的语法是什么,或者是否可以在 select 中使用 case 并在其中进行分区? (使用 sql 服务器 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
这是我需要解决的问题,这是我遇到的问题的一部分
以前
编辑:根据要求添加一些示例数据和预期结果 create table #testing (b varchar (20), a 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
我看到问题是这样的:即使不符合标准,也会添加东西。在我的 fiddle 中,您可以看到 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')
编辑:找到解决方案,写在下面作为答案
您不能将任意表达式 放在 中 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
找到了我在编辑中提出的问题的解决方案:
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