2017-12-20 22 views
1

私はすべてを見てきましたが、残念ながら、私が間違っていることを理解できないようです。私は、MySQLサーバーを使用する個人的な財務管理アプリケーションを開発しています。この問題のために、私は働いている4つのテーブルを持っています。カラム値に基づく条件付きジョイン

TRANSACTIONSテーブルには、SECONDARYCATEGORIESテーブルとBILLSテーブルのプライマリキーを参照するカラムCATIDBILLIDが含まれています。 TRANSACTIONSBILLSの両方の表には、PRIMARYCATEGORIES表の主キーを参照する列PCATIDがあります。

TRANSACTIONSテーブルの「量」列を合計し、プライマリキーをPCATIDから返し、その値に関連付けられているすべてのレコードの合計を返すSQLクエリを作成しています。 BILLID-1に設定されている場合、それはSECONDARYCATEGORIESSECONDARYCATEGORIES.ID = TRANSACTIONS.CATIDPCATIDを見つける必要があり、(-1はこれが法案されていないことを示すため)、それ以外の場合は、BILLS.IDTRANSACTIONS.BILLIDに一致するBILLレコードからPCATIDを見つける必要があります。

私は(当然、有効ではありません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、さまざまなJOINの無数を試してみましたが、私はちょうど作るように見えることはできませんこの作品。私はBILLIDの値に基づいてこれを別のSQLクエリに分割し、値を合計することを考えましたが、可能であれば、このすべてを1つのSQLクエリで実行したいと思います。

私はここで何かが分かりません。どのような助けも非常に感謝しています。

編集:BILLSテーブルを記述するのを忘れました。これには、プライマリカテゴリ、ID、および説明的なデータが含まれています。

+0

ここで2つの左外部結合が問題を解決できるはずです。あなたの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を使用します。しかし、2番目のクエリは明らかに、テーブルが見つからないために動作しません。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) 
関連する問題