我有一个包含客户数据行的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查询中过滤它们?
答案 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()
。