簡體   English   中英

如何進行合並重復的主鍵的SELECT

[英]how to make a SELECT that merges duplicated Primary Keys

我正在執行如下查詢:

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

我需要更改此查詢以帶來一個列表,該列表將忽略那些對於相同transactionIDvalue之和為0的情況 ,並且將customerID和值分組如下:

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

您能提供任何有關如何解決此問題的建議嗎?

嘗試這個 :

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;
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;

在開始時嘗試使用distinct,它將消除所有重復的值。

如果我理解正確,則需要條件聚合。 但是,您需要引導客戶,並且沒有專欄來做。 您可以使用變量枚舉每個交易的客戶,並使用它來輪換交易的前兩個客戶:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM