我看了一遍,不幸的是,我似乎无法弄清楚我做错了什么。我正在开发一个使用MySQL服务器的个人财务管理应用程序。对于这个问题,我有4张表,我正在使用。
TRANSACTIONS
表包含列CATID
和BILLID
,它们引用SECONDARYCATEGORIES
和BILLS
表中的主键。 TRANSACTIONS
和BILLS
表都有一列PCATID
,它引用PRIMARYCATEGORIES
表中的主键。
我正在构建一个SQL查询,它总结了一个"金额" TRANSACTIONS
表中的列,返回PCATID
中的主键以及与该值关联的所有记录的总和。如果BILLID
设置为-1
,它应该在PCATID
SECONDARYCATEGORIES
中找到SECONDARYCATEGORIES.ID = TRANSACTIONS.CATID
,否则(因为-1
表示这不是PCATID
一个帐单),它应该从BILL
匹配BILLS.ID
匹配的TRANSACTIONS.BILLID
记录中找到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
。
我正在寻找类似这样的东西(显然不是有效的SQL):
BILLID
我尝试过无数种不同的JOIN,IF语句等等,而我似乎无法做到这一点。我曾想过根据webView.configuration.websiteDataStore.httpCookieStore
的值将这些问题分解为不同的SQL查询,并对值进行求和,但如果可能的话,我真的很想在一个SQL查询中执行此操作。
我知道我在这里遗漏了一些明显的东西;任何帮助都非常感谢。
编辑:我忘了描述BILLS表。它包含主要类别ID,以及一些描述性数据。
答案 0 :(得分: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)
答案 1 :(得分: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
答案 2 :(得分:0)
您还可以在COALESCE
中使用CASE
和JOIN
。
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)