2013-09-02 2 views
-1

입력 데이터를 사용하는 특정 유형의 알약의 수를 찾기 :SAS의 SUMIFS - 환자

user DOB     UseDate   numPills Type 
1 2013-01-01 00:00:00.000 2013-04-11 00:00:00.000 4 A 
1 2013-01-01 00:00:00.000 2013-07-20 00:00:00.000 5 A 
1 2013-01-01 00:00:00.000 2014-01-02 00:00:00.000 1 A 
2 2013-01-02 00:00:00.000 2013-04-12 00:00:00.000 1 A 
3 2013-01-01 00:00:00.000 2013-04-11 00:00:00.000 5 A 
3 2013-01-01 00:00:00.000 2013-07-20 00:00:00.000 5 A 
4 2013-01-02 00:00:00.000 2013-04-12 00:00:00.000 1 A 
5 2013-01-01 00:00:00.000 2013-04-11 00:00:00.000 9 A 
5 2013-01-01 00:00:00.000 2013-07-20 00:00:00.000 1 B 
6 2013-01-01 00:00:00.000 2013-04-11 00:00:00.000 1 A 

원하는 출력 : 나는 SAS 엔터프라이즈 가이드 Excel의 SUMIFS을 구현하기 위해 노력하고있어

user DOB     UseDate   numPills Type  sumifs 
1 2013-01-01 00:00:00.000 2013-04-11 00:00:00.000 4 A 9 
1 2013-01-01 00:00:00.000 2013-07-20 00:00:00.000 5 A 5 
1 2013-01-01 00:00:00.000 2014-01-02 00:00:00.000 1 A 0 
2 2013-01-02 00:00:00.000 2013-04-12 00:00:00.000 1 A 1 
3 2013-01-01 00:00:00.000 2013-04-11 00:00:00.000 5 A 10 
3 2013-01-01 00:00:00.000 2013-07-20 00:00:00.000 5 A 5 
4 2013-01-02 00:00:00.000 2013-04-12 00:00:00.000 1 A 1 
5 2013-01-01 00:00:00.000 2013-04-11 00:00:00.000 9 A 9 
5 2013-01-01 00:00:00.000 2013-07-20 00:00:00.000 1 B 1 
6 2013-01-01 00:00:00.000 2013-04-11 00:00:00.000 1 A 1 

. 필자는 이미 커서를 사용하여 MS SQL Server 2008에서 비슷한 작업을 수행했습니다.

궁극적 인 목표는 튜플별로 튜플을 통과 할 수있게하는 것입니다. 또한 관련 레코드를 세트로 그룹화하는 방법을 고려 중이며 집합 작업을 사용할 수 있는지 확인합니다.

데이터 : 샘플 레코드는 환자의 약 처방이며 각 레코드에는 구입 한 약 개수가 자세히 나와 있습니다. 그러므로, 나는 각 환자의 알약의 수를 계산해야하는데, 이상적으로는 서로 다른 수납장에 들어야한다. 예.

환자 # 1, 환약 A, 3 환

환자 # 1, 환약 A, 2 환

환자 # 1, 환약 B 1 개, 약

I 새로운 컬럼을 생성해야 ("SUMIFS"를 사용하는) 첫 번째 행을 위해 생산할 것입니다 : 환자 # 1, 알약 A, 5 알 약

감사합니다 !!! 요청으로

(형식 미안, 나는이 포럼에 새로 온 사람) :

/****** Script for SelectTopNRows command from SSMS ******/ 
/* Cursor code begins here */ 
DECLARE @baseRWpointer CURSOR      -- Base (read, write) cursor 
DECLARE @offsetRpointer CURSOR      -- Offset (read only) cursor 

DECLARE @baseDate datetime 
DECLARE @baseUser integer 
DECLARE @baseType varchar(5) 
DECLARE @baseDOB datetime 

DECLARE @cumulative integer 
DECLARE @offsetCount integer 

DECLARE @offsetDate datetime 
DECLARE @offsetUser integer 
DECLARE @offsetType varchar(5) 
DECLARE @offsetNumPills integer 
DECLARE @offsetDOB datetime 

SET @baseDate = '1900-01-01' 
SET @baseUser = -1 
SET @baseType = NULL 

SET @cumulative = 0 
SET @offsetCount = 0 

SET @offsetRpointer = CURSOR SCROLL KEYSET 
    FOR 
     SELECT D.[user], D.[DOB], D.[UseDate], D.[numPills], D.[Type] 
     FROM [Charles_DB].[dbo].[Table1] D 
     ORDER BY D.[ID], D.[Type], D.[UseDate] 
    --FOR READ ONLY 
OPEN @offsetRpointer 

SET @baseRWpointer = CURSOR 
    FOR 
     SELECT D.[user], D.[DOB], D.[UseDate], D.[numPills], D.[Type] 
     FROM [Charles_DB].[dbo].[Table1] D 
     ORDER BY D.[user], D.[Type], D.[UseDate] 
    FOR update of D.[sumifs] 

OPEN @baseRWpointer 

FETCH NEXT from @baseRWpointer 
INTO @offsetUser, @offsetDOB, @offsetDate, @offsetNumPills, @offsetType 

FETCH NEXT from @offsetRpointer 
INTO @offsetUser, @offsetDOB, @offsetDate, @offsetNumPills, @offsetType 

WHILE (@@FETCH_STATUS = 0) 
BEGIN 

    SET @baseUser = @offsetUser 
    SET @baseType = @offsetType 
    SET @baseDOB = @offsetDOB 
    SET @cumulative = 0 
    SET @offsetCount = 0 

    /* Main "SUMIFS" loop */ 
    while ( 
      @@FETCH_STATUS = 0 AND 
      (@baseUser = @offsetUser) 
      AND (@baseType = @offsetType) 
      AND ((DATEDIFF(day,@baseDOB,@offsetDate)) <= 365) ) 
    BEGIN 
     Set @cumulative = @cumulative + @offsetNumPills 
     Set @offsetCount = @offsetCount + 1 

     FETCH NEXT from @offsetRpointer 
     INTO @offsetUser, @offsetDOB, @offsetDate, @offsetNumPills, @offsetType 

    END 

    /* Update the column "sumifs" for base row 
     Recall that D is [Charles_DB].[dbo].[Table1] */ 
    UPDATE [Charles_DB].[dbo].[Table1] 
     Set [Charles_DB].[dbo].[Table1].[sumifs] = @cumulative 
     WHERE CURRENT OF @baseRWpointer 

    /* Make offset pointer catch up to base pointer */ 
    Set @offsetCount = -(@offsetCount - 1) 
    FETCH RELATIVE @offsetCount from @offsetRpointer 
    INTO @offsetUser, @offsetDOB, @offsetDate, @offsetNumPills, @offsetType 

    /* Place this at the end to get the correct @@FETCH_STATUS output to avoid infinite loop */ 
    FETCH NEXT from @baseRWpointer 
    INTO @offsetUser, @offsetDOB, @offsetDate, @offsetNumPills, @offsetType 




END 

CLOSE @baseRWpointer 
CLOSE @offsetRpointer 
DEALLOCATE @baseRWpointer 
DEALLOCATE @offsetRpointer 
+1

SQL Server에있는 코드와 샘플 데이터 및 예상되는 결과를 보여주십시오. 귀하의 질문은 다소 불완전합니다. –

+0

나는 약간의 편집을했다. 그것으로 충분하겠습니까? SAS에서 SQL 문만 사용할 수 있다는 것을 알고 있습니다. SQL 문없이 동일한 작업을 수행 할 수있는 다른 방법이 있는지 궁금합니다. 감사! –

+0

보유하고있는 입력 데이터를 표시 할 수 있습니까? – sasfrog

답변

0

SAS는 절차 PROC의 SQL, PROC의 FREQ, PROC 개요 및 PROC의 집계가 있습니다. SAS Enterprise Guide의 쿼리 및 필터 노드는 PROC SQL 단계를 실행하므로 특허, 알약으로 결과를 그룹화 한 다음 알약 수를 합산 할 수 있어야합니다.

0

아마도 내가 원하는 것을 완전히 이해하지 못하고 있습니다.

귀하의 데이터 세트가 위에서 제시 한 것 (환자, 필 유형, 약)과 유사하다고 가정합니다. 이것은 간단한 SQL 요약처럼 들립니다.

PROC SQL noprint; 
create table PillSummary as 
select Patient, 
     PillType, 
     sum(Pills) as Pills 
    from MyTable 
    group by Patient, PillType; 
quit; 

환자 및 유형별 약제 요약이있는 PillSummary라는 테이블이 작성됩니다. 다른 것을 찾고 있다면 알려주세요.