2017-04-25 33 views
0

私は顧客データの行を含むDB2テーブルを持っています。これは、顧客が当社のサービスを使用してお金を貯めたかどうかを判断するために使用されます古いレコードはプロセスを引き起こした購入であり、新しいレコードは同じ製品を再度購入した後です。希望の結果は、最も古い支払額、最新の金額、2行の差異を含む1つの行が、お金を貯めたことを確認することです。データはこのDB2は複数の行を1つの結果として選択します

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でこれらの値を同じ行に取得する方法はありますか、結果を取り戻し、SQLクエリーではなくPHPコードでフィルタリングする必要がありますか?顧客ごとに2つの行を想定し

+0

「cost.saleid」を2回使用することを意図していましたか?それは重複したエントリを引き起こしている可能性がありますか? – DD84

答えて

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()が必要かどうかはわかりません。

+0

注意:sum(firstpaid) - sum(lastpaid)sum(firstpaid)がnullまたはsum(lastpaid)がnullの場合はnullを返します。あなたはsum(ifnull(firstpaid、0))を使用して、代わりに他の合計にすることができます;) – Esperento57

関連する問題