0

SQL クエリを作成して、請求書を定期的に支払った顧客と支払っていない顧客を取得しようとしています。テーブルは ORACLE です。

CUSTOMERS table.
customers_id   customers_name   bill_value    payment_date
----------------------------------------------------------
001            ary              30000         1/14/2012
001            ary              30000         2/14/2012
001            ary              30000         3/14/2012
001            ary              30000         4/14/2012
002            budhy            25000         1/21/2012
002            budhy            25000         2/25/2012
002            budhy            25000         3/21/2012
002            budhy            25000         4/23/2012
003            chanadh          51000         1/17/2012
003            chanadh          51000         2/17/2012
003            chanadh          51000         3/17/2012
003            chanadh          51000         4/17/2012    

質問は..

まず、請求書を定期的に支払った顧客を表示したいのですが、このように期待した結果です..

customers_id   customers_name   bill_value    payment_date
----------------------------------------------------------
001            ary              30000         1/14/2012
001            ary              30000         2/14/2012
001            ary              30000         3/14/2012
001            ary              30000         4/14/2012
003            chanadh          51000         1/17/2012
003            chanadh          51000         2/17/2012
003            chanadh          51000         3/17/2012
003            chanadh          51000         4/17/2012

第二に、請求書を定期的に支払っていない顧客を表示したい、このように期待した結果..

customers_id   customers_name   bill_value    payment_date
----------------------------------------------------------
002            budhy            25000         1/21/2012
002            budhy            25000         2/25/2012
002            budhy            25000         3/21/2012
002            budhy            25000         4/23/2012

今、私はまだクエリに固執しています。それを行う方法がわかりません。誰か助けてもらえますか?

私の英語でごめんなさい

4

3 に答える 3

3

これを試して

定期的にお支払いいただいているお客様

WITH CTE AS
(
  SELECT A.*,COUNT(DISTINCT EXTRACT(day from to_date(payment_date,'mm/dd/yyyy'))) 
              OVER (PARTITION BY customers_id) cnt
  FROM TEST A
)
SELECT * FROM CTE WHERE CNT = 1;

請求書を定期的に支払っていない顧客

WITH CTE AS
(
  SELECT A.*,COUNT(DISTINCT EXTRACT(day from to_date(payment_date,'mm/dd/yyyy'))) 
              OVER (PARTITION BY customers_id) cnt
  FROM TEST A
)
SELECT * FROM CTE WHERE CNT > 1; 

SQLデモ

于 2013-02-14T05:05:36.453 に答える
0
select this.*, next.payment_date next_payment_date
from CUSTOMERS this
join CUSTOMERS next on next.customers_id = this.customers_id 
and next.payment_date = (select min(payment_date) from CUSTOMERS where customers_id = this.customers_id and payment_date>this.payment_date)
where trunc(add_months(this.payment_date,1)) < trunc(next.payment_date)

SQLFiddle: http://sqlfiddle.com/#!4/007e0/4

于 2013-02-14T05:05:20.643 に答える
0

してみてください:

SELECT
  y.*, 
  (CASE WHEN PD=CN THEN 'Regular' ELSE 'Irregular' END) Status
FROM (
    SELECT
      x.*,
      count(*) over (partition by CUSTOMERS_ID, EXTRACT(day FROM payment_date)) PD,
      count(*) over (partition by CUSTOMERS_ID) CN
    FROM CUSTOMERS x
)y;
于 2013-02-14T05:17:58.700 に答える