DB2将多行选择为单个结果

时间:2017-04-25 14:14:32

标签: sql db2

我有一个包含客户数据行的DB2表。这用于确定客户是否使用我们的服务节省了资金。较旧的记录是触发我们流程的购买,而较新的记录是在他们再次购买相同产品之后。期望的结果是看到一行包含他们最早的付款金额,他们的最新金额以及两行之间的差异以验证他们存钱。

数据的布局如下

ID       Name       Product ID    Sale ID      First Paid     Last Paid
1        Mary       15            195          8              NULL
2        Mary       15            195          NULL           3
3        Bob        8             283          16             NULL
4        Bob        8             283          NULL           11

期望的结果是

Name     Sale ID    Product ID     First Paid  Last Paid    Savings     
Mary     195        15             8           3            5
Bob      283        8              16          11           5

这就是我得到的

Name    Sale ID    Product ID     First Paid     Last Paid     Savings   
Mary    195        15             8              NULL          8
Mary    195        15             NULL           3             -3
Bob     283        8              16             NULL          16
Bob     283        8              NULL           11            -11

此查询的结果用于驱动更大的报告,因此这是作为子查询的一部分生成的。

SELECT cost.name, cost.saleid, cost.productid, cost.saleid,
cost.firstpaid, cost.lastpaid, sum(cost.firstpaid - cost.lastpaid) as savings 
from (
    select distinct saleid, max(name) as name, max(productid) as productid, 
    max(firstpaid) as firstpaid, max(lastpaid) as lastpaid) as cost

我发现我的大型查询按预期工作,但是这个最里面的查询返回的多行对结果产生负面影响,因为当客户只计算一次时会被计算两次。 DB2中是否有一种方法可以将这些值放到同一行中,还是需要将结果拉回来并在PHP代码中而不是在SQL查询中过滤它们?

1 个答案:

答案 0 :(得分:2)

假设每个客户有两行,那么聚合似乎是正确的方法:

select Name, SaleID, ProductID,
       sum(firstpaid) as firstpaid, sum(lastpaid) as lastpaid
       sum(firstpaid) - sum(lastpaid) as savings
from t
group by Name, SaleID, ProductID;

这适用于两行以上。如果还有其他行,我不确定您是否需要sum()min()max()avg()