条件JOIN基于列值

问题描述 投票:1回答:3

我看了一遍,不幸的是,我似乎无法弄清楚我做错了什么。我正在开发一个使用MySQL服务器的个人财务管理应用程序。对于这个问题,我有4个表正在使用。

TRANSACTIONS表包含CATIDBILLID列,它们指的是SECONDARYCATEGORIESBILLS表中的主键。 TRANSACTIONSBILLS表都有一个PCATID列,它指的是PRIMARYCATEGORIES表中的主键。

我正在构建一个SQL查询,该查询对TRANSACTIONS表中的“amount”列进行求和,并返回PCATID中的主键以及与该值关联的所有记录的总和。如果BILLID设置为-1,它应该在PCATID找到SECONDARYCATEGORIES,其中SECONDARYCATEGORIES.ID = TRANSACTIONS.CATID,否则(因为-1表明这不是一个法案),它应该从PCATID记录找到BILL,其中BILLS.ID匹配TRANSACTIONS.BILLID

我正在寻找类似这样的东西(显然不是有效的SQL):

SELECT
 SECONDARYCATEGORIES.PCATID,
 SUM(TRANSACTIONS.AMOUNT)
FROM
 TRANSACTIONS
IF (BILLID = -1) JOIN SECONDARYCATEGORIES ON SECONDARYCATEGORIES.ID = TRANSACTIONS.CATID
ELSE JOIN SECONDARYCATEGORIES ON SECONDARYCATEGORIES.ID = BILLS.CATID WHERE BILLS.ID = TRANSACTIONS.BILLID

我尝试过无数种不同的JOIN,IF语句等,而我似乎无法使这项工作成功。我曾经想过根据BILLID的值将这个问题分解成不同的SQL查询,并对这些值进行求和,但我真的很想在可能的情况下在一个SQL查询中执行此操作。

我知道我在这里遗漏了一些明显的东西;很感谢任何形式的帮助。

编辑:我忘了描述BILLS表。它包含主要类别ID,以及一些描述性数据。

mysql sql join aggregates
3个回答
2
投票

您可以在OR中使用JOIN,如下所示:

SELECT S.PCATID,
       SUM(T.AMOUNT)
FROM TRANSACTIONS T 
LEFT JOIN BILLS ON BILLS.ID = T.BILLID 
JOIN SECONDARYCATEGORIES S ON (S.ID = T.CATID AND T.BILLID = -1)
                           OR (S.ID = BILLS.CATID AND BILLS.ID = T.BILLID)

0
投票

我使用UNION来选择任一查询。但是第二个查询显然不起作用,因为它缺少BILLS表。

SELECT SECONDARYCATEGORIES.PCATID
    , SUM(TRANSACTIONS.AMOUNT)
FROM TRANSACTIONS
JOIN SECONDARYCATEGORIES ON SECONDARYCATEGORIES.ID = TRANSACTIONS.CATID AND BILLID = -1
UNION
SELECT SECONDARYCATEGORIES.PCATID
    , SUM(TRANSACTIONS.AMOUNT)
FROM TRANSACTIONS
JOIN SECONDARYCATEGORIES ON SECONDARYCATEGORIES.ID = BILLS.CATID AND BILLID <> -1
WHERE BILLS.ID = TRANSACTIONS.BILLID

0
投票

你也可以在你的COALESCEs中使用CASEJOIN

SELECT ID = COALESCE(s.PCATID,b.PCATID)
    ,Total = SUM(t.AMOUNT)
FROM TRANSACTIONS t
LEFT JOIN BILLS b ON b.BILLID = CASE WHEN t.BILLID <> -1 THEN t.BILLID END
LEFT JOIN SECONDARYCATEGORIES s ON s.CATID = CASE WHEN t.BILLID = -1 THEN t.CATID END
GROUP BY COALESCE(s.PCATID,b.BILLID) 
© www.soinside.com 2019 - 2024. All rights reserved.