2

私は SQL (具体的には t-sql と microsoft SQL Server 2008 R2) を初めて使用し、上司からカーソルを使用して修正するように勧められた問題がありました。問題は、1 時間を超える (ただし、1 時間で割り切れる) 記録 (名簿に入力されたシフトに等しい) を取得し、それらをレポート用にそれぞれ 1 時間の複数のシフト記録に効果的に分割することです。

以下に、使用したカーソル ロジックに関するクエリのセクションを示します。私の理解では、カーソルは非常に非効率的であり、眉をひそめていますが、私の上司も私も、この問題に対する代替ソリューションを特定できませんでした.

カーソルなしでこれを行う方法を誰かが実証できますか?

Open Curs;

 FETCH NEXT FROM Curs INTO @ClientID, @RDNSID, @SvceType, @SDate, @ClientNm, @CHours, @StaffNm, @Package

WHILE (@@Fetch_Status = 0)
BEGIN
      SET @Hour = 60
      SET @Num = @Chours
    IF (@Num % 60 = 0)
            BEGIN
                  WHILE (@Num >= 60)
                  BEGIN
                        INSERT INTO #ASRTable VALUES (@ClientID, @RDNSID, @SvceType, @SDate, @ClientNm, @Hour, @StaffNm, @Package)
                        SET @Num = @Num - 60
                        SET @SDate = DATEADD(HH, 1, @SDate)
                  END
            END

      ELSE
            BEGIN
                  SET @Hour = 'INVALID SHIFT'
                  INSERT INTO #ASRTable VALUES (@ClientID, @RDNSID, @SvceType, @SDate, @ClientNm, @Hour, @StaffNm, @Package)
            END

      FETCH NEXT FROM Curs INTO @ClientID, @RDNSID, @SvceType, @SDate, @ClientNm, @CHours, @StaffNm, @Package
END


SELECT * FROM #ASRTable

DROP TABLE #ASRTable   

CLOSE Curs
DEALLOCATE Curs
4

1 に答える 1

1

さて、あなたは私たちにサンプルデータや期待される結果を与えていませんが、これは同じ論理に従っていると思います:

declare @t table (
    SDate datetime not null,
    Chours int not null --Curiously, will store a number of minutes?
)

insert into @t (SDate,Chours) values ('2012-12-19T10:30:00',120),('2012-12-18T09:00:00',60),('2012-12-17T08:00:00',90)

;with shifts as (
    select SDate,Chours,'60' as Hour from @t where Chours % 60 = 0
    union all
    select DATEADD(hour,1,SDate),CHours - 60,'60' from shifts where Chours > 0
)
select SDate,Hour from shifts
union all
select SDate,'Invalid Shift' from @t where CHours % 60 <> 0

結果:

SDate                   Hour
----------------------- -------------
2012-12-19 10:30:00.000 60
2012-12-18 09:00:00.000 60
2012-12-18 10:00:00.000 60
2012-12-19 11:30:00.000 60
2012-12-19 12:30:00.000 60
2012-12-17 08:00:00.000 Invalid Shift

もちろん、他のすべての列を持っているわけではありません。それらが何を意味するのかわからないからです。

于 2012-12-19T07:25:54.493 に答える