2016-09-07 4 views
1

私はこのようなクエリを実行しています:マージSELECTを作るためにどのように複製された主キーは

SELECT a.transactionID,a.customerID,b.value  
     FROM adjustments a 
       INNER JOIN change b 
         on a.transactionID = b.transactionID 
         and a.event_date = b.event_date 
         and a.event_id  = b.event_id 
     WHERE comment LIKE 'TRANSFER' 
     ORDER BY a.transactionID; 

このクエリは次のような結果をもたらす:

transactionID | customerID | value 
    ------------------------------------  
    TRANSFER-001 | CUSTA | -200 
    TRANSFER-001 | CUSTB | 200 
    TRANSFER-002 | CUSTC | -150 
    TRANSFER-002 | CUSTD | 0 
    TRANSFER-003 | CUSTA | 0 
    TRANSFER-003 | CUSTC | 150 

私はこれを変更する必要がvalueの合計がであり、同じtransactionIDの場合を無視し、さらにcustomerIDをグループ化し、次の値をグループ化するリストをもたらすクエリ:

transactionID | customerID_A | value_A | customerID_B | value_B 
------------------------------------------------------------------  
    TRANSFER-002 | CUSTC  | -150 | CUSTD  | 0 
    TRANSFER-003 | CUSTA  |  0 | CUSTC  | 150 

これを解決する方法についてアドバイスをいただけますか?

+0

どのようなテーブルAとBがどのように見えるか教えてください。それはあなたの元のクエリに記載されていない希望の出力の列を持っていると思われる – kbball

+0

@ kabball管理者は、私は完全なテーブルのプロパティを共有することはできませんが、私はテーブルAはすべてのtranferの詳細、使用されているサービス、使用されているサービスなど)、テーブルBには、金額とその他の数値データのみが格納されます。 –

答えて

1

これを試してみてください:

SELECT * FROM (
SELECT a.transactionID,a.customerID,b.value  
    FROM adjustments a 
    INNER JOIN change b 
        on a.transactionID = b.transactionID 
        and a.event_date = b.event_date 
        and a.event_id  = b.event_id 
    WHERE comment LIKE 'TRANSFER' 
)M 
GROUP BY transactionID,customerID,value 
HAVING SUM(value) <> 0 
ORDER BY transactionID; 
+0

代わりにSUM(value)<> 0と思っています。彼はそれが否定できないとは言わなかった、ちょうど0 – kbball

+0

@kbballはいありがとう –

+0

すべてのアイデアを試してくれてありがとう! –

0
SELECT distinct a.transactionID,a.customerID,b.value  
    FROM adjustments a 
      INNER JOIN change b 
        on a.transactionID = b.transactionID 
        and a.event_date = b.event_date 
        and a.event_id  = b.event_id 
    WHERE comment LIKE 'TRANSFER' 
    ORDER BY a.transactionID; 

は、それがすべての重複値を排除する冒頭で明確な試してみてください。

+0

おかげですね私はすべての提案を試してみましょう!どうもありがとう。 –

0

私が正しく理解していれば、条件付き集計が必要です。ただし、顧客をピボットする必要があり、そのための列はありません。変数を使用して各取引の顧客を列挙し、トランザクションの最初の2人の顧客をピボットすることができます。

SELECT transactionId, 
     MAX(CASE WHEN seqnum = 1 THEN customerId END) as customer_A, 
     MAX(CASE WHEN seqnum = 1 THEN value END) as value_A, 
     MAX(CASE WHEN seqnum = 2 THEN customerId END) as customer_B, 
     MAX(CASE WHEN seqnum = 2 THEN value END) as value_B 
FROM (SELECT a.transactionID, a.customerID, b.value, 
      (@rn := if(@t = a.transactionID, @rn + 1, 
         if(@t := a.transactionID, 1, 1) 
         ) 
      ) as seqnum 
     FROM adjustments a INNER JOIN 
      change c 
      ON a.transactionID = c.transactionID AND 
       a.event_date = c.event_date AND 
       a.event_id  = c.event_id CROSS JOIN 
      (SELECT @rn := 0, @t := '') params, 
     WHERE comment LIKE 'TRANSFER' 
     ORDER BY a.transactionID, b.value DESC 
    ) t 
GROUP BY transactionId 
HAVING SUM(value) <> 0; 
+0

これを実験して、助けてくれてありがとう。私は他の質問があれば私は戻ってきます! –

関連する問題