【问题标题】:SQL Join same table based on other tablesSQL 基于其他表连接同一张表
【发布时间】:2021-09-30 19:18:14
【问题描述】:

我有一个 payment 表,与 dates 表和 event 表相关。我用我想要的结果进行了单独的查询:

SELECT employee_id, payment.value ADDITIONAL
FROM payment
INNER JOIN dates ON payment.date_id = dates.id
INNER JOIN event ON payment.event_id = event.id 
WHERE date = '03-2021'
    AND employee_id = 71
    AND event.number = 10015


SELECT employee_id, payment.value SALARY
FROM payment
INNER JOIN dates ON payment.date_id = dates.id
INNER JOIN event ON payment.event_id = event.id 
WHERE date = '03-2021'
    AND employee_id = 71
    AND event.number = 4096

这基本上给出了这个结果:

我想要的是这个员工在同一行的结果:

【问题讨论】:

    标签: sql join group-by


    【解决方案1】:

    改成

    SELECT t1.employee_id, t1.payment.additional,t2.SALARY
    FROM
    (SELECT employee_id, payment.additional
    FROM payment
    INNER JOIN dates ON payment.date_id = dates.id
    INNER JOIN event ON payment.event_id = event.id 
    WHERE date = '03-2021'
        AND employee_id = 71
        AND event.number = 10015) t1
        
    JOIN 
    
    (SELECT employee_id, payment.salary SALARY
    FROM payment
    INNER JOIN dates ON payment.date_id = dates.id
    INNER JOIN event ON payment.event_id = event.id 
    WHERE date = '03-2021'
        AND employee_id = 71
        AND event.number = 4096) t2
    ON t1.employee_id = t2.employee_id
    

    【讨论】:

    • 对不起,我的查询有误,我修正了。它是 event.number,而不是 payment.number
    【解决方案2】:

    您可以使用条件聚合来做到这一点:

    SELECT p.employee_id, 
           MAX(CASE WHEN e.number = 10015 THEN p.value END) additional,
           MAX(CASE WHEN e.number = 4096 THEN p.value END) salary
    FROM payment p
    INNER JOIN dates d ON p.date_id = d.id
    INNER JOIN event e ON p.event_id = e.id 
    WHERE d.date = '03-2021' AND p.employee_id = 71
      AND e.number IN (10015, 4096)
    GROUP BY p.employee_id
    

    请注意,您应该使用它们所属的表的名称/别名来限定所有列。在您的查询中,我假设 employee_idpayment 中的一列,datedates 中的一列。

    【讨论】:

    • 对不起,我的查询有误,我修正了。它是 event.number,而不是 payment.number
    • @aseolin 我用number 的正确别名进行了编辑。
    • additional和payment是同一个字段(值)的别名
    猜你喜欢
    • 2017-07-17
    • 2016-11-27
    • 2022-06-15
    • 2017-07-27
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    相关资源
    最近更新 更多