2017-12-20 3 views
1

나는 다 보았다. 그리고 불행히도, 내가 잘못하고있는 것을 알아낼 수 없다. MySQL 서버를 사용하는 개인 재무 관리 응용 프로그램을 개발하고 있습니다. 이 문제를 해결하기 위해 나는 4 개의 테이블을 가지고있다.열 값을 기준으로 조건부 조인

TRANSACTIONS 표는 SECONDARYCATEGORIESBILLS 테이블의 기본 키를 참조 열 CATIDBILLID이 포함되어 있습니다. TRANSACTIONSBILLS 테이블에는 PRIMARYCATEGORIES 테이블의 기본 키를 참조하는 PCATID 열이 있습니다.

TRANSACTIONS 테이블의 "amount"열을 합한 SQL 쿼리를 작성하고 PCATID의 기본 키와 해당 값과 관련된 모든 레코드의 합계를 반환합니다. BILLID-1로 설정되어있는 경우, 그것은 발견해야 PCATID (-1는이 법안이 아니다 나타 내기 때문에) SECONDARYCATEGORIES.ID = TRANSACTIONS.CATID, 그렇지 않으면, 그것은 BILL 레코드에서 PCATID을 발견해야하는 위치 SECONDARYCATEGORIES의 경우 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 

가 나는 등, IF 문, 다른 조인의 무수를 시도, 난 그냥 할 수없는 것 이 일. 나는이 값을 BILLID의 값을 기반으로 다른 SQL 쿼리로 분할하고 값을 합산하는 방법을 생각했지만 가능하다면이 모든 것을 하나의 SQL 쿼리에서 수행하고 싶습니다.

나는 여기에서 명백한 무엇인가를 놓치고 있다는 것을 알고있다. 어떤 도움이라도 대단히 감사합니다.

편집 : BILLS 테이블을 설명하는 것을 잊었습니다. 기본 카테고리 인 ID와 설명 데이터가 포함되어 있습니다.

+0

두 개의 왼쪽 외부 조인이 여기에서 문제를 해결할 수 있어야합니다. 귀하의 BILLS 테이블이 없습니다. – maSTAShuFu

+0

여기에 BILLS 테이블이 보이지 않습니다. – Eric

+0

샘플 데이터와 예상 출력을 제공 할 수 있습니까? –

답변

1

당신은 당신의 JOINOR을 사용할 수 있습니다 :

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

이것은 내가 찾고있는 것입니다. 어쨌든 나는 AND/OR이 JOIN의 ON 부분에서 허용되지 않는다는 인상을 받고있었습니다. 도움을 많이 주셔서 감사합니다. – cameron

+0

@cameron 문제 없습니다. 다행입니다. –

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

또한 JOIN의에서 COALESCECASE를 사용할 수 있습니다.

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) 
관련 문제