2013-12-12 107 views
2

我有一個SQL語句,看起來如此:SQL減列值BY語句

​​

返回此:

FY_CD|PD_NO| INPUT | HOURS 

2008 1 Actuals  61000 
2008 1 Baseline 59000 
2008 2 Actuals  54000 
2008 2 Baseline 59000 
2008 3 Actuals  60000 
2008 3 Baseline 70000 

我試圖找出如何從每個週期的基線值中減去實際值,返回以下內容:

FY_CD|PD_NO| INPUT | HOURS 

2008 1 Variance 2000 
2008 2 Variance -5000 
2008 3 Variance -10000 

任何幫助我s讚賞。

+0

如果您從Baseline值中減去Actuals值,您的示例全部反轉。 – LittleBobbyTables

+1

正確。概念上是一樣的。 – thefreeline

回答

5

實際上,你可以直接使用CASE檢查的Input價值計算的話,

SELECT FY_CD, 
     PD_NO, 
     'Variance' INPUT, 
     SUM(CASE WHEN Input = 'Actuals' THEN HOURS ELSE -1 * HOURS END) HOURS 
FROM LABOR_TABLE 
GROUP BY PD_NO 
+0

謝謝,這個工作很好。我必須對CASE語句做一些小的修改,因爲我的數據集實際上在INPUTCODE字段中包含了4個不同的值:'Actuals','Baseline','Current','Rebaseline'。 – thefreeline

+0

+1爲我的問題的解決方案和指向SQLFIDDLE(驚人的工具)! – renatoargh

0

我相信這會工作。基本上我試圖subquery你的基線和實際值,所以我可以將它們分組到相同的行從一個減去另一個。

SELECT FY_CD, PD_NO, 'Variance' As Input, tmp.Actuals - Baseline As Hours FROM (
select FY_CD, PD_NO, 
(SELECT SUM(HOURS) from LABOR_TABLE WHERE Input = 'Actuals' group by PD_NO, INPUT) As Actuals, 
(SELECT SUM(HOURS) from LABOR_TABLE WHERE Input = 'Baseline' group by PD_NO, INPUT) As Baseline, 
group by PD_NO, INPUT 
) as tmp 
0

您可以使用子查詢表分爲兩個部分,然後加入部分,使得實際值和基線是在同一行(由PD_NO)。然後它只是簡單的減法。

SELECT  Baseline.FY_CD 
     , Baseline.PD_NO 
     , SUM(Baseline.HOURS - Actuals.Hours) 
FROM  (SELECT * FROM LABOR_TABLE WHERE INPUT = 'Baseline') AS Baseline 
JOIN  (SELECT * FROM LABOR_TABLE WHERE INPUT = 'Actuals') AS Actuals 
     ON Actuals.PD_NO = Baseline.PD_NO 
GROUP BY Baseline.PD_NO 
;