2016-11-29 5 views
0

私は、ユーザーが製品を変更したときに誰が変更したのか、古いコストと新しいコスト、そしてパーセント価格の差異を調べるデータセットを持っています。MySQL固有の除外ケースグループ

グループを使用する場合は、where、statement、またはcaseを使用して、同じ日に変更が発生して元の価格が維持されたため、変更を除外する製品をグループ化して除外します。

だから私は除外したい状況は、次のようになります。

| product | Changed By | Old Price | New Price | % diff | Day Changed | 
|----------|------------|-----------|-----------|--------|-------------| 
| blue hat | me   |  94.00 |  95.00 | 1.05 | 2016-11-28 | 
| blue hat | me   |  95.00 |  94.00 | 1.05 | 2016-11-28 | 

任意のアイデアはどのようにMySQLでこれを行うには?

+0

行ごとに一意のIDがありますか?青い帽子の前のドットは間違いでしかないのですか?開始日と終了日の価格を調べるために、1日あたりの変更数をテーブルに表示しますか? –

+0

製品に加えられた変更ごとに固有のIDがあり、両方の製品が共有するParentIDがあります。 – mburgSolar

+0

1日に何回変更が行われたのか分かりませんが、価格変更を追跡し始めたばかりですが、1回のレコード変更につき、ユーザーがミスをして元に戻した場合は2回以下にする必要があります。何度か? – mburgSolar

答えて

0

ここでは、サブクエリ、where's、group by'sを使ってこれを確認したいと思う人のための働くバージョンです。

このクエリは、1日のスパンに対するユーザーのアイテムコストの変化を調べ、「昨日」のすべての結果を取得します。その日のすべての変更を1つのascと1つのdescにリストし、そのように価格の変化を比較します。もし彼らが一番古い変化からそれが新しい変化に変わった場合、それは免除されます。

SELECT 
    us.Name, 
    it.Name, 
    pal.CS_PA_Line_Supplier__c as supplier_name, 
    newest.NewValue as new_value, 
    oldest.OldValue as old_value, 
    ((newest.NewValue - oldest.OldValue)/oldest.OldValue) * 100 as Percentage 
FROM  
(
    SELECT Id, Name, KNDY4__Item__c, CS_PA_Line_Supplier__c 
    FROM KNDY4__Contract_Line__c 
) pal 

LEFT JOIN 
(
    SELECT * 
    FROM 
    (
     SELECT 
      ParentId, 
      CreatedById, 
      CreatedDate, 
      Field, 
      NewValue 
     FROM KNDY4__Contract_Line__History 
     WHERE CreatedDate >= CURDATE() - INTERVAL 1 DAY 
      AND CreatedDate < CURDATE() 
      AND Field='KNDY4__Negotiated_Price__c' 
     ORDER BY CreatedDate DESC 
    ) cd 
    GROUP BY ParentId 
) newest 
    ON newest.ParentId=pal.Id 

LEFT JOIN 
(
    SELECT * FROM (
     SELECT 
      ParentId, 
      OldValue 
     FROM KNDY4__Contract_Line__History 
     WHERE CreatedDate >= CURDATE() - INTERVAL 1 DAY 
      AND CreatedDate < CURDATE() 
      AND Field='KNDY4__Negotiated_Price__c' 
     ORDER BY CreatedDate ASC 
    ) cd 
    GROUP BY ParentId 
) oldest 
    ON oldest.ParentId=pal.Id 

LEFT JOIN 
(
    SELECT Id, Name 
    FROM User 
) us 
    ON us.Id = newest.CreatedById 

LEFT JOIN 
(
    SELECT Id,Name 
    FROM KNDY4__Item__c 
) it 
    ON it.Id=pal.KNDY4__Item__c 

WHERE newest.ParentId IS NOT NULL 
    AND oldest.OldValue IS NOT NULL 
    AND newest.NewValue != oldest.OldValue 
GROUP BY pal.KNDY4__Item__c, pal.CS_PA_Line_Supplier__c 
ORDER BY it.Name ASC 
関連する問題