6

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

TRANSACTIONS表包含列CATID,这些列引用和表BILLID中的主键。和表都有一个引用表中主键的列。SECONDARYCATEGORIESBILLSTRANSACTIONSBILLSPCATIDPRIMARYCATEGORIES

我正在构建一个 SQL 查询,该查询对表中的“金额”列求和,并从与该值关联的所有记录中TRANSACTIONS返回主键和总和。PCATID如果BILLID设置为-1,它应该PCATIDSECONDARYCATEGORIESwhere 中找到SECONDARYCATEGORIES.ID = TRANSACTIONS.CATID,否则(因为-1表明这不是账单),它应该PCATID从匹配的BILL记录中找到。BILLS.IDTRANSACTIONS.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 语句等,但我似乎无法完成这项工作。我曾想过根据 的值将其分解为不同的 SQL 查询BILLID,并对这些值求和,但如果可能的话,我真的很想在一个 SQL 查询中完成这一切。

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

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

4

3 回答 3

7

您可以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)
于 2017-12-20T20:16:52.970 回答
1

你也可以在你的 s中使用COALESCE和。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) 
于 2017-12-20T20:25:48.347 回答
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
于 2017-12-20T19:58:54.407 回答