テーブル:
日付shopId量 17-MAY-19 1 100 17-MAY-19 2 20 16-MAY-19 2 20 17-APR-19 1 50
要件に従って、同じテーブルのレコードを見つける必要があります。
sysdateなどの日付を指定して、各shopIdのその日付のレコード(日付は各shopIdで一意)と30日前のレコードを検索します。
2つのレコードの量を比較して、絶対%diffが5より大きいかどうかを確認します(以下のコードでは、%の代わりに0.05を使用します)。
2つのレコードの両方が存在し、%diffが一致する場合、レコードは結果セットに含まれている必要があります。
すべてshopId
のに対してこれを実行し、結果セットを返します。
レコードを取得して、JAVAやPHPなどのバックエンド言語で比較することはできますが、慣れていないSQLで比較する方がよいのではないかと思います。
select *
from table t1
inner join table t2 on t1.shopId = t2.shopId
WHERE t1.ordertime = sysdate
and t2.ordertime = sysdate - 30
and abs( (t1.amount - t2.amount) / t2.amount > 0.05 )
期待される結果は次のようになります。
表: shopId Date1 amount1 Date2 amount2 1 17-MAY-19 100 17-APR-19 50
助けてください、ありがとう。
sysdateには常に現在の日付と時刻が含まれているため、trunc
関数を使用する必要がありますsysdate
with tab as(
select to_date('17.05.2019','dd.mm.yyyy') as dat, 1 as shopid, 100 as amount from dual union all
select to_date('17.05.2019','dd.mm.yyyy') as dat, 2 as shopid, 20 as amount from dual union all
select to_date('16.05.2019','dd.mm.yyyy') as dat, 2 as shopid, 20 as amount from dual union all
select to_date('17.04.2019','dd.mm.yyyy') as dat, 1 as shopid, 50 as amount from dual
)
select *
from tab t1
join tab t2 on t1.shopid = t2.shopid
WHERE t1.dat = trunc(sysdate)
and t2.dat = trunc(sysdate - 30)
and (t1.amount - t2.amount) / t2.amount > 0.05
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加