如何在连接表 SQL 查询中添加逻辑?

How to add logic in a joining tables SQL query?

我必须根据几个 table 创建一个 table。

结果 table 包含多个列:一些列直接取自源 table,但其他列需要更多逻辑。

在下面的查询中(我的问题的简短示例)你有

SELECT
    cntr.cntr_id, 
    cove.eff_date, cove.end_date,
    amou.amount AS paid_start_date, amou.amount AS paid_curr_date
FROM 
    msa_contract cntr, msa_coverage cove, msa_amount amou
WHERE 
    cntr.cntr_id = '1234'
    AND cove.cntr_id = cntr.cntri_id
    AND amou.cvrg_id = cove.cvrg_id

我的问题出现在最后两列(paid_start_datepaid_curr_date )。这两列来自同一列 amou.amount.

只有在 amou.start_date = cntr.start_date

时,paid_start_date 列才应采用 amou.amount

只有在 cntr.cancelled = 'No'

时,paid_curr_date 列才应该取 amou.amount

我真的不知道如何在我的查询中整合这两个规则。你能帮我解决这个问题吗?

The column paid_start_date should take amou.amount only when amou.start_date = cntr.start_date

CASE WHEN amou.start_date = cntr.start_date THEN amou.amount END as paid_start_date

The column paid_curr_date should take amou.amount only when cntr.cancelled = 'No'

CASE WHEN cntr.cancelled = 'No' THEN amou.amount END as paid_curr_date 

你没有说如果谓词为假是否应该存在其他值,所以我没有放 ELSE。如果 CASE 没有找到任何谓词为真,并且没有 ELSE,则结果为 NULL


作为脚注,我不知道您遵循了哪个教程来获得像这样连接数据的建议,但它一定是很老的了,因为我们已经鼓励这种形式大约 30 年了:

FROM 
    msa_contract cntr
    INNER JOIN msa_coverage cove ON cove.cntr_id = cntr.cntri_id
    INNER JOIN msa_amount amou ON amou.cvrg_id = cove.cvrg_id
WHERE 
    cntr.cntr_id = '1234'

它实际上和你写的一样,除了你把 , 放在哪里我们放 INNER JOIN 和 WHERE 部分中的任何 x.y = a.b 将数据联系在一起,我们把它放在后面右手后面的单词 ON table name/alias