2015-09-14 1 views
1

Quelle est la syntaxe correcte ou est-il possible d'utiliser case dans une partition select et dans par? (Utilisant le serveur SQL 2012)sélectionnez un cas avec "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 

c'est quelque chose que je dois résoudre ce qui est une partie d'un problème que j'avais précédemment sumProduct in sql

modifier: sur demande l'ajout des données échantillon et résultat attendu create table #testing (b varchar (20), une date, c int, int e)

 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 

j'ai vu que le problème est le suivant: des choses sont ajoutées en même si elles ne correspond pas aux critères. Dans mon violon, vous pouvez voir que le résultat pour sumProduct est 49 au lieu de 39 parce que 2 * 5 de adfe est ajouté. Que puis-je faire à ce sujet?

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

modifier: trouvé la solution, écrit comme une réponse ci-dessous

+1

Puis-je reformuler le problème d'une autre manière? ou ce que je fais mal (concernant le downvote). Encore un débutant sur ce site, toute suggestion vous aidera. Merci –

Répondre

3

Vous ne pouvez pas mettre des expressions arbitraires au sein l'expression Aggregate() OVER (PARTITION clause) - donc déplacer les calculs supplémentaires à l'extérieur:

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

c'est exactement ce que je voulais. Merci, ne pouvait pas comprendre cette partie, était si proche mais si loin –

+0

si un est une date et pas un ID. alors puis-je supposer que mon code fera la (somme de c * e)/100 * 3423 pour chaque date? Le truc c'est que mon code fonctionne mais les résultats que je reçois ne sont même pas proches de ce que je voulais. Ce que je veux est ceci: pour chaque date, multipliez la valeur de c * e et ajoutez-la avec la valeur du prochain c * e pour l'article suivant qui est de la forme 'xf%'. Ma question ici est: est-ce que ma logique s'applique encore à ce que je veux? –

+0

@viorelmunteanu - si vous souhaitez une aide plus détaillée, éditez votre question et ajoutez-y quelques * exemples * de données et * résultats attendus *. Il peut parfois être difficile de comprendre ce que quelqu'un essaie de faire purement à partir d'un récit. –

0

Trouvé la solution pour ce que je demandais dans mon édition:

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