与'预定义行'分组

时间:2014-08-15 04:22:34

标签: sql-server group-by

说我必须关注PaymentTransaction表:

 ID       Amount    PayMethodID
 ----------------------------
 10254     100        1      
 15789     150        1      
 15790     200        0      
 16954     300        0      
 17864     400        1      
 19364     500        1      
 PayMethodID  Desc
 ----------------------------
 0            CASH     
 1            VISA   
 2            MASTER      
 3            AMEX     
 4            ETC   

我只需使用group by将PayMethodID分组为1和0。

我要做的是在GROUP BY

下显示不存在的PayMethodID

我目前使用简单分组语句的结果是

PayMethodID   TotalAmount
-------------------------
0             500
1             1150

预期结果(如果未在事务表中退出则显示0):

PayMethodID   TotalAmount
-------------------------
0             500
1             1150
2             0
3             0
4             0

这可能是一个简单且重复的问题,但我无法找到要搜索的关键字。如果你能找到我的任何重复,我会删除这篇文章。感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用LEFT JOIN,因此将显示最左侧表( TableA )中的所有行是否在另一个表上具有匹配值。

SELECT  a.PayMethodID,
        TotalAmount = ISNULL(SUM(b.Amount), 0)
FROM    TableA AS a                  -- <== contains list of card type
        LEFT JOIN TableB AS b        -- <== contains the payment list
            ON a.PayMethodID = b.PayMethodID
GROUP   BY a.PayMethodID

答案 1 :(得分:1)

常规的OUTER(LEFT)JOIN将为您提供PayMethod表中的所有行,无论它们是否存在于PaymentTransaction表中,其余的总和为NULL。然后,您可以使用COALESCE使空行为零;

SELECT pm.PayMethodID, COALESCE(SUM(pt.Amount), 0) TotalAmount
FROM PayMethod pm
LEFT JOIN PaymentTransaction pt
  ON pm.PayMethodID = pt.PayMethodID
GROUP BY pm.PayMethodID

An SQLfiddle to test with