2016-08-04 6 views
1

erste Tabelle ist meine Eingabe und erwarten Ausgabe wie zweite Tabelle ohne mit linken Join. dies ist die Tabellendatenerwartet Ausgabe ohne mit linken Join

declare @table table 
(customer_id int, 
indicator bit, 
salary numeric(22,6) 
,netresult numeric(22,6)) 

INSERT INTO @table (
    customer_id 
    ,indicator 
    ,salary 
    ) 
VALUES 
(1,1,2000), 
(1,1,3000), 
(2,1,1000), 
(1,0,500), 
(1,1,5000), 
(2,1,2000), 
(2,0,100) 

select * from @table order by customer_id,indicator desc 

ich unten Methode versuchte es funktioniert. Gibt es eine bessere Alternative?

SELECT a.customer_id 
    ,a.indicator 
    ,a.salary 
    ,netresult=p_salary-(2*n_salary) 
FROM (
    SELECT customer_id 
     ,indicator 
     ,salary 
     ,sum(salary) OVER (PARTITION BY customer_id) p_salary 
    FROM @table 
    ) a 
LEFT JOIN (
    SELECT customer_id 
     ,indicator 
     ,salary 
     ,sum(salary) OVER (PARTITION BY customer_id) n_salary 
    FROM @table 
    WHERE indicator = 0 
    ) b ON a.customer_id = b.customer_id 
    order by customer_id,indicator desc 

Erwartete Ausgabe

enter image description here

Antwort

3

Ich glaube, Sie dies wünschen:

select t.customer_id, t.indicator, 
     sum(case when indicator = 1 then salary else - salary end) over (partition by customer_id) as netresult 
form @table t; 

Keine verbindet notwendig sind.

1

mit Mathe

select t.customer_id, t.indicator, t.salary 
    , sum(((t.indicator * 2) -1) * salary) over (partition by customer_id) as netresult 
from @table t; 
Verwandte Themen