基于列值的条件 JOIN
Conditional JOIN based on column value
我已经看了一遍,不幸的是,我似乎无法弄清楚我做错了什么。我正在开发一个使用 MySQL 服务器的个人财务管理应用程序。对于这个问题,我有 4 个 table 正在处理。
TRANSACTIONS
table 包含 CATID
和 BILLID
列,它们引用 SECONDARYCATEGORIES
和 BILLS
[=54] 中的主键=]秒。 TRANSACTIONS
和 BILLS
table 都有一列 PCATID
引用 PRIMARYCATEGORIES
table.[=33= 中的主键]
我正在构建一个 SQL 查询,该查询对 TRANSACTIONS
table 中的 "amount" 列和来自 [=18 的主键 returns 求和=] 以及与该值关联的所有记录的总和。如果 BILLID
设置为 -1
,它应该在 SECONDARYCATEGORIES
中找到 PCATID
,其中 SECONDARYCATEGORIES.ID = TRANSACTIONS.CATID
,否则(因为 -1
表示这不是账单),它应该从 BILL
记录中找到 PCATID
,其中 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 table。它包含一个主要类别、ID,以及一些描述性数据。
我使用 UNION
选择任一查询。但是第二个查询显然不会工作,因为它缺少 BILLS
table.
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
您可以在 JOIN
中使用 OR
,像这样:
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)
您还可以在 JOIN
中使用 COALESCE
和 CASE
。
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)
我已经看了一遍,不幸的是,我似乎无法弄清楚我做错了什么。我正在开发一个使用 MySQL 服务器的个人财务管理应用程序。对于这个问题,我有 4 个 table 正在处理。
TRANSACTIONS
table 包含 CATID
和 BILLID
列,它们引用 SECONDARYCATEGORIES
和 BILLS
[=54] 中的主键=]秒。 TRANSACTIONS
和 BILLS
table 都有一列 PCATID
引用 PRIMARYCATEGORIES
table.[=33= 中的主键]
我正在构建一个 SQL 查询,该查询对 TRANSACTIONS
table 中的 "amount" 列和来自 [=18 的主键 returns 求和=] 以及与该值关联的所有记录的总和。如果 BILLID
设置为 -1
,它应该在 SECONDARYCATEGORIES
中找到 PCATID
,其中 SECONDARYCATEGORIES.ID = TRANSACTIONS.CATID
,否则(因为 -1
表示这不是账单),它应该从 BILL
记录中找到 PCATID
,其中 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 table。它包含一个主要类别、ID,以及一些描述性数据。
我使用 UNION
选择任一查询。但是第二个查询显然不会工作,因为它缺少 BILLS
table.
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
您可以在 JOIN
中使用 OR
,像这样:
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)
您还可以在 JOIN
中使用 COALESCE
和 CASE
。
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)