因此,每个提案可能有两行,其中一行bt.stage_id = 1(如果已被接受)但未对帐,第1行用于第2阶段。
我想执行以下计算,但如果第2阶段存在,则只添加第2阶段而不是阶段1,我该怎么做?
SELECT SUM(bt.novartis_total) AS 'NovartisTotal'
FROM budget_totals bt, rfp_proposal rp
WHERE (bt.rfp_proposal_id = 1 OR bt.rfp_proposal_id = 22)
AND rp.status_type='Accepted'
AND rp.vendor_id=2
AND (rp.id = 1 OR rp.id=22)
以下是一些示例数据: 第1行
rp.id = 22,stage_id = 2,novartis_total = 3750
第2行
rp.id = 22,stage_id = 1,novartis_total = 40000
第3行
rp.id = 11,stage_id = 2,novartis_total = 7580
第4行
rp.id = 11,stage_id = 1,novartis_total = 20000
第5行
rp.id = 24,stage_id = 1,novartis_total = 8591
第6行
rp.id = 1,stage_id = 1,novartis_total = 6092
总和应该是novartis总数,并且忽略第1阶段中id 22和11的20k和40k值。
答案 0 :(得分:2)
您发布的查询缺少JOIN条件,制作笛卡尔积 - 使用:
SELECT SUM(CASE
WHEN bt.stage_id = 1 THEN bt.novartis_total
ELSE 0
END) - SUM(CASE
WHEN bt.stage_id = 2 THEN bt.novartis_total
ELSE 0
END) AS 'NovartisTotal_stage1',
SUM(CASE
WHEN bt.stage_id = 2 THEN bt.novartis_total
ELSE 0
END) AS 'NovartisTotal_stage2'
FROM BUDGET_TOTALS bt
JOIN RFP_PROPOSAL rp ON rp.id = bt.rfp_proposal_id
WHERE bt.rfp_proposal_id IN (1, 22)
AND rp.status_type = 'Accepted'
AND rp.vendor_id = 2
只需要从第1阶段中减去第2阶段记录的数量......除非您有数据问题,其中有人可能是第2阶段,而不是第1阶段。
答案 1 :(得分:0)
UNION ALL
+子查询是你的朋友。我无法理解你所说的“第一阶段”或“第二阶段”,但这里是你如何做到这一点的要点:
SELECT (query for stage 1)
WHERE NOT EXISTS (query for stage 2)
UNION ALL
SELECT (query for stage 2)
;
答案 2 :(得分:0)
SELECT SUM(CASE bt.stage_id
WHEN 2 THEN bt.novartis_total
ELSE 0
END) AS 'NovartisTotal'
FROM budget_totals bt,
rfp_proposal rp
WHERE ( bt.rfp_proposal_id = 1
OR bt.rfp_proposal_id = 22 )
AND rp.status_type = 'Accepted'
AND rp.vendor_id = 2
AND ( rp.id = 1
OR rp.id = 22 )