2013-12-12 63 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 
;