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

前端 未结 3 1213
我寻月下人不归
我寻月下人不归 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:29

    SUM CASE using example:

        SELECT 
      DISTINCT(p.`ProductID`) AS ProductID,
      SUM(IF(p.`PaymentMethod`='Cash',Amount,0)) AS Cash_,
      SUM(IF(p.`PaymentMethod`='Check',Amount,0)) AS Check_,
      SUM(IF(p.`PaymentMethod`='Credit Card',Amount,0)) AS Credit_Card_,
      SUM( CASE PaymentMethod 
          WHEN 'Cash' THEN Amount
          WHEN 'Check' THEN Amount
          WHEN 'Credit Card' THEN Amount
         END) AS Total
    FROM
      `payments` AS p 
    GROUP BY p.`ProductID`;
    

    SQL FIDDLE: http://www.sqlfiddle.com/#!9/23d07d/18

    0 讨论(0)
  • 2020-12-07 14:37

    I think you're making this a bit more complicated than it needs to be.

    SELECT
        ProductID,
        SUM(IF(PaymentMethod = 'Cash', Amount, 0)) AS 'Cash',
        -- snip
        SUM(Amount) AS Total
    FROM
        Payments
    WHERE
        SaleDate = '2012-02-10'
    GROUP BY
        ProductID
    
    0 讨论(0)
  • 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

    0 讨论(0)
提交回复
热议问题