2015-09-14 4 views
1

Какой правильный синтаксис или можно использовать случай в разделе выбора и в нем? (С помощью SQL Server 2012)выберите случай с надписью «over partition by»

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

редактировать: по запросу добавив некоторые образцы данных и ожидаемый результат создать таблицу #testing (б VARCHAR (20), дата, с 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, потому что добавляется 2 * 5 от adfe. Что я могу сделать по этому поводу?

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') 

редактировать: найдено решение, написал его в качестве ответа ниже

+1

Можно ли переформулировать проблему по-другому? или что я делаю неправильно (относительно downvote). Все еще новичок на этом сайте, любое предложение поможет. Спасибо –

ответ

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 
+0

Это именно то, что я хотел. Спасибо, не мог понять эту часть, был настолько близок, но пока –

+0

что если a - дата, а не идентификатор. то могу ли я предположить, что мой код сделает (сумма c * e)/100 * 3423 на каждую дату? Дело в том, что мой код работает, но результаты, которые я получаю, даже не закрыты тем, что я хотел. Я хочу, чтобы это: для каждой даты умножьте значение c * e и добавьте его со значением следующего c * e для следующего элемента, который имеет форму «xf%». Мой вопрос здесь: действительно ли моя логика подходит для того, что я хочу? –

+0

@ viorelmunteanu - если вы хотите получить более подробную помощь, возможно, отредактируйте свой вопрос и добавьте некоторые данные * * и * ожидаемые результаты *. Иногда бывает трудно понять, что кто-то пытается делать из рассказа. –

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 
Смежные вопросы