2017-11-01 12 views
-2

안녕하세요, 인터넷 친구, 당신의 도움이 필요합니다. 나는 SQL 프로그래밍을하는 초심자이며, 나는 함께 일하는 것에 도움이 필요하다. 여기 PROC SQL/SAS - 매달 사용중인 제품을 가져 옵니까?

내가 TABLE1

CustNbr ProductNm ExpirationDt(date value) 
    AAA111 Product1 15MAY2017 
    AAA112 Product1 21JAN2017 

에 지금 집결지 무엇을 그리고 여기에 내가하고 싶은 내용은 다음과 같습니다

CustNbr Yr Mth ProductNm 
    AAA111 2017 01 Product01 
    AAA111 2017 02 Product01 
    AAA111 2017 03 Product01 
    AAA111 2017 04 Product01 
    AAA111 2017 05 Product01 
    AAA112 2017 01 Product01 

Essentialy, 나는 고객이 활성 제품의 월별보기를하고 싶습니다 그들이 만료되는 날짜뿐만 아니라 내가 원하는 테이블을 재현하는 데 사용할 수있는 표현의 종류는 무엇입니까?

시간 내 주셔서 감사합니다.

+0

이 작업은 데이터베이스가 아닌 프로그램 코드에서 수행하는 것이 좋습니다. – osrpt

+0

분명히 동의합니다. 나는 정말로 내가 얻고 자하는 것을 재현하기 위해 사용할 수있는 표현의 종류가 무엇인지 알지 못합니다. – THEPIGE

답변

0

은 데이터를 폭발 다음 코드 여기

SELECT  CustNbr, YEAR(ExpirationDt) AS Yr, MONTH(ExpirationDt) AS Mnt, ProductNm 
FROM   TableName 
+0

숫자가 아닌 월 이름을 표시하려면 "7"이 "7"이 아닌 다음 코드 "DATENAME"을 사용하십시오. – sam7

+0

OP는 입력 행당 하나의 행만 선택하지만 OP는 입력 행마다 여러 출력 행을 원합니다. SQL에서이 작업을 수행하려면 월/날짜 테이블과 교차 조인해야합니다. – david25272

+0

알아요,하지만 "THEPIGE"는 Table1에 대해서만 언급했기 때문에이 코드를 썼습니다. – sam7

4

인에게 한 가지 방법을 사용합니다. 시작 날짜를 선택해야합니다. INTNX 함수는 날짜 범위를 탐색 할 때 유용합니다.

data have; 
input CustID $ ProdID $ ExpDate ; 
attrib 
    ExpDate format=date9. informat=date9. 
; 
datalines; 
    AAA111 Product1 15MAY2017 
    AAA112 Product1 21JAN2017 
run; 

data want; 
    set have; 

    * Which start date do you want ?; 
    start_date = today(); * looking forward only; 
    start_date = intnx('year', ExpDate, 0); * first of the year of the expiration date; 
    start_date = intnx('year', today(), 0); * first of the year at run-time; 

    date = start_date; 
    do index = 1 by 1 while (date < ExpDate); 
    year = Year(date); 
    month = Month(date); 
    output; 
    date = intnx('month', date, 1); 

    if index > 1e5 then leave; * guard against coding/data errors causing to many loops; 
    end; 
    format month z2.; 
    keep CustID ProdID year month; 
run;