2017-02-24 5 views
1

enthält habe ich eine kleine DatenSQL ein Feld multiplizieren, wenn ein anderes Feld in derselben Gruppe einen bestimmten Wert

SELECT PID, PCODE, PVAL 
FROM mytable 

Ausgänge gesetzt:

PID PCODE PVAL 
2 N50 £1,000.00 
2 B10 £100.00 
2 P40 £500.00 
3 B10 £100.00 
3 P40 £500.00 
4 B10 £100.00 
4 P40 £500.00 

ich ausgeben wollen die gleichen Felder außer wenn eine PID Gruppe hat einen PCODE von N50, dann muss ihre B10 um 5% des N50 reduziert werden.

Erwartete Ausgabe:

PID PCODE PVAL 
2 N50 £1,000.00 
2 B10 £50.00 
2 P40 £500.00 
3 B10 £100.00 
3 P40 £500.00 
4 B10 £100.00 
4 P40 £500.00 

Ich habe versucht, eine Unterabfrage für diese und eine Fall-Anweisung kann aber nicht die Werte übereinstimmen bekommen.

Antwort

1

Sie verwenden, um einen case Ausdruck und max Funktion, dies zu tun. Dies setzt voraus, dass eine PID nur eine Zeile mit pcode = N50 haben kann.

select pid,pcode 
,case when pcode='B10' then pval-0.05*max(case when pcode='N50' then pval else 0 end) over(partition by pid) 
else pval end as pval 
from mytable t 

Edit: Ein Weg, um das Ergebnis zu Jahr zu beschränken, die B10-Code enthalten ist

select pid,pcode 
,case when pcode='B10' then pval-0.05*max(case when pcode='N50' then pval else 0 end) over(partition by pid) 
else pval end as pval 
from mytable t 
where yearcolumn in (select yearcolumn from mytable where pcode='B10') 
1

Sie können dies tun, mit analytischen Funktionen:

SELECT PID, PCODE, 
     (PVAL - 
     COALESCE(SUM(CASE WHEN PCODE = 'N50' THEN PVAL * 0.05 END) OVER (PARTITION BY PID), 0) 
     ) as PVAL 
FROM mytable; 

Eigentlich ist die COALESCE() nicht notwendig sind:

SELECT PID, PCODE, 
     (PVAL - 
     SUM(CASE WHEN PCODE = 'N50' THEN PVAL * 0.05 ELSE 0 END) OVER (PARTITION BY PID) 
     ) as PVAL 
FROM mytable; 
+0

Keine der beiden Aktionen führt zum B10-Feld – Matt

1

Diese Lösung links verwendet kommen nur ein Spiel zu erhalten, wenn die Haupttabelle ‚B10‘ hat und die zweite Tabelle hat 'N50'. Wenn es eine Übereinstimmung gibt: Rückgabe PVAL diskontiert um 5% der N50 PVAL. Wenn keine Übereinstimmung vorhanden ist: Rückgabewert PVAL

SELECT t1.PID, T1.PCODE, t1.PVAL - isnull(.05 * t2.PVAL, 0) PVAL 
    FROM mytable t1 
    left join #mytable t2 
     on t1.PID = t2.PID and t1.PCode = 'B10' and t2.PCode = 'N50' 
Verwandte Themen