2017-05-01 3 views
2

주어진 달에 특정 트랜잭션 ID가있는 계정 수를 계산하는 SQL 스크립트가 있습니다. 나는 이것을 수정하여 주어진 달에뿐만 아니라 지난 3 개월 동안 각 유형의 트랜잭션을 배치 한 경우 accts 수를 계산합니다. 일회성 이벤트를 걸러내는 것입니다.SQL : 지난 3 개월 동안 특정 거래 ID가있는 계정 계산

나는 SQL을 처음 접했고 내가 만든 검색을 통해 확실한 대답을 찾을 수 없었습니다. 어떤 도움을 주시면 감사하겠습니다. 감사!

SELECT 
    CLDR.YEAR_MONTH 
    ,COUNT(DISTINCT TRAN.ACCT_NBR) AS IC_DD --counts all unique Acct numbers 

FROM 
    REPORTS.FINANCIAL_TRAN AS TRAN 

INNER JOIN REPORTS.ACCT AS ACCT ON TRAN.ACCT_NBR=ACCT.ACCT_NBR 
INNER JOIN REPORTS.DATE AS CLDR ON TRAN.TRAN_DT=CLDR.CALENDAR_DATE 

WHERE 
    TRAN.TRAN_CD IN ('id1','id2','id3') --Filters on Transaction IDs 
AND 
    TRAN.TRAN_DT BETWEEN '2017-01-01' AND '2017-03-31' 

GROUP BY 
    CLDR.YEAR_MONTH 

ORDER BY 
    CLDR.YEAR_MONTH 

답변

0

당신은에 가입하지 않아도 모두 ACCT 및 달력 테이블 :

SELECT Count(*) 
FROM 
(
    SELECT ACCT_NBR 
    FROM REPORTS.FINANCIAL_TRAN AS TRAN 
    WHERE 
     TRAN.TRAN_CD IN ('id1','id2','id3') --Filters on Transaction IDs 
    AND 
     TRAN.TRAN_DT BETWEEN '2017-01-01' AND '2017-03-31' 
    GROUP BY ACCT_NBR 
    -- rows for all three months exist for this account 
    HAVING Count(DISTINCT EXTRACT(MONTH FROM tran_dt)) = 3 
) AS dt 

편집 :

이 달의 일정 범위해서는 안 의견을 바탕으로

, 동적으로, 즉 매월 계산 된 이전 달 두 달 내에 거래가 있었던 계정이 몇 개나 있습니까?

SELECT trans_month, Count(*) 
FROM 
(
    SELECT 
     ACCT_NBR, 
    ,Trunc(TRAN_DT, 'mon') AS trans_month -- 1st of month 
    FROM TRAN 
    WHERE 
     TRAN.TRAN_CD IN ('id1','id2','id3') --Filters on Transaction IDs 
-- AND 
--  TRAN.TRAN_DT BETWEEN '2017-01-01' AND '2017-03-31' 
    GROUP BY ACCT_NBR, trans_month -- distinct list first 
    QUALIFY 
     -- check if there are three consecutive months 
     -- e.g. 
     -- 2017-02-01 <- 2 preceding, must be 2 months before current row 
     -- 2017-03-01 <- 1 preceding 
     -- 2017-04-01 <- current row 
     Min(trans_month) 
     Over (PARTITION BY ACCT_NBR 
      ORDER BY trans_month 
      ROWS 2 Preceding) = Add_Months(trans_month,-2) 
) AS dt 
GROUP BY trans_month 
ORDER BY trans_month 
+0

그건 속임수 였어. 나는 데이터 추출에서 달력 결과를 보여줄 수있는 방법을 찾아 낼 것이다. 감사! – starfly

+0

@starfly : 어떤 캘린더 결과, 'DATE'2017-01-01''? 당신은 하드 코딩 된 날짜 범위가 있고 매월 행이있는 고객 수를 계산하려고합니다. – dnoeth

+0

YYYYMM 형식의 날짜 열을 갖고 싶습니다. (이것이 내가 CLDR에 가입 한 이유입니다) 그리고 주어진 달 , TRAN_DT에 대한 지난 3 개월을 가져옵니다. 따라서 CLDR 월이 201703 일 경우 TRAN_DT 2017-01-01 - 2017-03-31; CLDR 월이 201702 인 경우 TRAN_DT 2016-12-01 - 2017-02-28을 가져옵니다. 그렇게하는 간단한 방법이 있습니까? – starfly

0

무력 접근 방식은 매달에 대한 IN 절을 추가하는 것입니다 :

여기
AND TRAN.ACCT_NBR IN (
     SELECT ACCT_NBR 
     FROM REPORTS.FINANCIAL_TRAN 
     WHERE TRAN_DT BETWEEN '2017-01-01' AND '2017-01-31') 
AND TRAN.ACCT_NBR IN (
     SELECT ACCT_NBR 
     FROM REPORTS.FINANCIAL_TRAN 
     WHERE TRAN_DT BETWEEN '2017-02-01' AND '2017-02-28') 
AND TRAN.ACCT_NBR IN (
     SELECT ACCT_NBR 
     FROM REPORTS.FINANCIAL_TRAN 
     WHERE TRAN_DT BETWEEN '2017-03-01' AND '2017-03-31') 
+0

그리고 이것은 WHERE 절의 일부가 될 것입니다. 맞습니까? 나는 이것이 내가 원하는 결과를 얻는지를보기 위해 이것을 시도 할 것이다. – starfly

0

내가 MSSQL에서 할 것이다 방법이다. Teradata에서 윈도우 기능을 사용할 것으로 확신합니다.

테스트 예를 위해 데이터를 단순화하고 있지만 제대로 된 결과를 얻을 수 있습니다. CTE의 이유는 창에서 COUNT DISTINCT를 사용할 수 없기 때문입니다.

CREATE TABLE #Test (
    ACCT_NBR int 
    ,YEAR_MONTH char(5) 
    ,TRAN_DT datetime) 

INSERT INTO #Test 
SELECT 123, '17/01', '2017-01-11'; 
INSERT INTO #Test 
SELECT 123, '17/02', '2017-02-12'; 
INSERT INTO #Test 
SELECT 123, '17/02', '2017-02-21'; 
INSERT INTO #Test 
SELECT 123, '17/03', '2017-03-19'; 
INSERT INTO #Test 
SELECT 356, '17/01', '2017-01-14'; 
INSERT INTO #Test 
SELECT 356, '17/01', '2017-01-22'; 
INSERT INTO #Test 
SELECT 356, '17/03', '2017-03-14'; 

SELECT * FROM #Test; 

WITH CTE AS (
    SELECT DISTINCT 
     ACCT_NBR AS AccountNumber 
     ,YEAR_MONTH AS YYMM 
    FROM #Test 
    WHERE TRAN_DT BETWEEN '2017-01-01' AND '2017-03-31') 

SELECT DISTINCT 
    YYMM 
    ,COUNT(AccountNumber) OVER (PARTITION BY YYMM) AS Counts 
FROM CTE 
+0

감사합니다. 불행히도 DBMS에 대한 쓰기 권한이 없기 때문에 임시 테이블을 생성 할 수 없습니다. – starfly

+0

테이블 변수를 사용하십시오. 또는 허가를 요청하십시오. 또는 user7593937이 예제를 보여주고 테이블을 사용할 수 있다는 사실에 액세스하십시오. – Morzel

+0

임시 테이블은 작업 할 데이터를 제공하고 작업중인 데이터를 복제하려고했습니다.이 솔루션에는 임시 테이블이 필요하지 않습니다. CTE에서 쿼리를 사용한 다음 창 함수를 사용하여 계산하십시오. – user7593937

관련 문제