如果条件为true,如何选择一行,如果在sql中条件为false,则如何选择其他行?

时间:2010-11-10 05:14:22

标签: sql

因此,每个提案可能有两行,其中一行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值。

3 个答案:

答案 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 ) 
相关问题