입력 데이터를 사용하는 특정 유형의 알약의 수를 찾기 :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
SQL Server에있는 코드와 샘플 데이터 및 예상되는 결과를 보여주십시오. 귀하의 질문은 다소 불완전합니다. –
나는 약간의 편집을했다. 그것으로 충분하겠습니까? SAS에서 SQL 문만 사용할 수 있다는 것을 알고 있습니다. SQL 문없이 동일한 작업을 수행 할 수있는 다른 방법이 있는지 궁금합니다. 감사! –
보유하고있는 입력 데이터를 표시 할 수 있습니까? – sasfrog