SQL基于具有Group By语句的第二列值减去列值

时间:2013-12-12 17:48:51

标签: sql group-by subtraction

我有一个看起来如此的SQL语句:

select FY_CD, PD_NO, INPUT, SUM(HOURS) 
from LABOR_TABLE
group by PD_NO, INPUT;

返回:

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

感谢任何帮助。

3 个答案:

答案 0 :(得分:6)

您可以直接使用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

答案 1 :(得分: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
;

答案 2 :(得分:-1)

我相信这会奏效。基本上我正在尝试子查询您的Baseline和Actuals值,以便我可以将它们分组到同一行中以从另一行中减去一个。

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