MySQL - sum column value(s) based on row from the same table

前端 未结 3 1212
我寻月下人不归
我寻月下人不归 2020-12-07 13:46

I\'m trying to get \'Cash\', \'Check\' and \'Credit Card\' totals in new columns based on ProductID from the same table.

Table - Payments

+---------         


        
3条回答
  •  抹茶落季
    2020-12-07 14:51

    This might be seen as a little complex but does exactly what you want

    SELECT 
      DISTINCT(p.`ProductID`) AS ProductID,
      SUM(pl.CashAmount) AS Cash,
      SUM(pr.CashAmount) AS `Check`,
      SUM(px.CashAmount) AS `Credit Card`,
      SUM(pl.CashAmount) + SUM(pr.CashAmount) +SUM(px.CashAmount) AS Amount
    FROM
      `payments` AS p 
      LEFT JOIN (SELECT ProductID,PaymentMethod , IFNULL(Amount,0) AS CashAmount FROM payments WHERE PaymentMethod = 'Cash' GROUP BY ProductID , PaymentMethod ) AS pl 
        ON pl.`PaymentMethod` = p.`PaymentMethod` AND pl.ProductID = p.`ProductID`
      LEFT JOIN (SELECT ProductID,PaymentMethod , IFNULL(Amount,0) AS CashAmount FROM payments WHERE PaymentMethod = 'Check' GROUP BY ProductID , PaymentMethod) AS pr 
        ON pr.`PaymentMethod` = p.`PaymentMethod` AND pr.ProductID = p.`ProductID`
      LEFT JOIN (SELECT ProductID, PaymentMethod , IFNULL(Amount,0) AS CashAmount FROM payments WHERE PaymentMethod = 'Credit Card' GROUP BY ProductID , PaymentMethod) AS px 
        ON px.`PaymentMethod` = p.`PaymentMethod` AND px.ProductID = p.`ProductID`
    GROUP BY p.`ProductID` ;
    

    Output

    ProductID | Cash | Check | Credit Card | Amount
    -----------------------------------------------
        3     | 20   |  15   |   25        |  60
        4     | 5    |  6    |   7         |  18
    

    SQL Fiddle Demo

提交回复
热议问题