MySQL – 根据同一个表中的行求和列值(s)

我试图根据同一个表中的ProductID在新列中获得“现金”,“支票”和“信用卡”总计。

表 – 付款

+-----------+------------+---------------+--------+ | ProductID | SaleDate | PaymentMethod | Amount | +-----------+------------+---------------+--------+ | 3 | 2012-02-10 | Cash | 10 | | 3 | 2012-02-10 | Cash | 10 | | 3 | 2012-02-10 | Check | 15 | | 3 | 2012-02-10 | Credit Card | 25 | | 4 | 2012-02-10 | Cash | 5 | | 4 | 2012-02-10 | Check | 6 | | 4 | 2012-02-10 | Credit Card | 7 | +-----------+------------+---------------+--------+ 

期望的输出 –

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

我试过左边join同一张桌子,但没有任何成功。 任何build议,将不胜感激。 谢谢。

不成功和不完整的尝试 –

 SELECT P.ProductID, Sum( PCash.Amount ) AS 'Cash', SUM( PCheck.Amount ) AS 'Check', SUM( PCredit.Amount) AS 'Credit Card' FROM Payments AS P LEFT JOIN Payments AS PCash ON P.ProductID = PCash.ProductID AND PCash.PaymentMethod = 'Cash' LEFT JOIN Payments AS PCheck ON P.ProductID = PCheck.ProductID AND PCheck.PaymentMethod = 'Check' LEFT JOIN Payments AS PCredit ON P.ProductID = PCredit.ProductID AND PCredit.PaymentMethod = 'Credit' WHERE P.SaleDate = '2012-02-10' GROUP BY ProductID; 

我认为你会使这个比需要更复杂一点。

 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 

这可能被认为有点复杂,但确实如你所愿

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

产量

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

SQL小提琴演示

SUM CASE使用示例:

  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

结果和表格视图