我有一个看起来如此的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
感谢任何帮助。
答案 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