Where 절에서 While 루프를 사용하는 방법

Ruedi

오늘까지 EntryTime 열에 항목이있는 다음과 같은 테이블이 있습니다.

1 번 테이블

PersonID|StartTime|EndTime|EntryTime
1       |10:00    |12:00  |2014-01-01
1       |10:00    |12:00  |2014-01-02
1       |10:00    |12:00  |2015-01-03
...

및 계약 테이블 :

표 2

PersonID|ContractID| ContractStart| ContractType|Hours
1       |1         |2014-01-01    |Student      |8
1       |2         |2015-01-01    |Trainee      |40
1       |3         |2015-03-01    |Student      |20
1       |4         |2015-05-01    |Student      |12

이제 아래에 언급 된 결과 테이블을 사용하여 (datediff(minute, StartTime, Endtime))현재 시간을 합산하고 싶습니다 contractType. contracttype마지막에 연속 시작해야합니다. 따라서이 예에서는 계약 3 + 4의 모든 항목이 관련됩니다.

내 생각은 a를 사용 loop하여 관련 계약을 선택하는 것이 었 습니다.

WHILE (Select ContractType from Table2) = 'Student'
Begin
Select ContractStart from Table2
Order By ContractStart
End

불행히도 루프는 아직 작동하지 않으며 where 절에 구현하는 방법을 모르겠습니다.

내가 얻으려는 결과 테이블 은 2015-03-01부터 시작하는 모든 항목 이있는 것 subset입니다.Table1

진 피륙

예없이 원하는 것이 무엇인지 알기는 어렵지만 시도입니다. 또한 유형에 대해 많은 추측을하십시오.

참고 : while 루프커서를 피하고 논리를 설정하십시오 =)

declare @Table1 as table
(
    PersonID int
    ,StartTime datetime
    ,EndTime datetime
    ,EntryTime date
)

insert into @Table1
values
 (1       ,'10:00', '12:00', '2014-01-01')
,(1       ,'10:00', '12:00', '2014-01-02')
,(1       ,'10:00', '12:00', '2015-01-03')
,(2       ,'10:00', '12:00', '2015-01-03')
,(2       ,'10:00', '12:00', '2015-01-04')
,(3       ,'10:00', '12:00', '2015-01-03')
,(3       ,'10:00', '12:00', '2015-01-05')


declare @Table2 as table
(
    PersonID int
    ,ContractID int
    ,ContractStart date
    ,ContractType varchar(10)
    ,[Hours] float
)
insert into @Table2
values
 (1       ,1         ,'2014-01-01',    'Student',      8)
,(1       ,2         ,'2015-01-01',    'Trainee',      40)
,(1       ,3         ,'2015-03-01',    'Student',      20)
,(1       ,4         ,'2015-05-01',    'Student',      12)
,(2       ,1         ,'2014-01-01',    'Student',      8)
,(2       ,2         ,'2015-01-01',    'Trainee',      40)
,(2       ,3         ,'2015-03-01',    'Student',      20)
,(2       ,4         ,'2015-05-01',    'Student',      12)
,(3       ,1         ,'2014-01-01',    'Student',      8)
,(3       ,2         ,'2015-01-01',    'Trainee',      40)
,(3       ,3         ,'2015-03-01',    'Student',      20)
,(3       ,4         ,'2015-05-01',    'Student',      12)

--Current contrat (for PersonId = 1)
declare @CurrentType varchar(10) =
(select top 1 ContractType from @Table2 where PersonID = 1 order by ContractStart desc)

--Last different type start (for PersonId = 1)
declare @LastDiff date = 
(select top 1 ContractStart from @Table2 where PersonID = 1 and @CurrentType != ContractType order by ContractStart desc)

--Current type span (for PersonId = 1)
select datediff(minute, min(StartTime + cast(EntryTime as datetime)), max(EndTime + cast(EntryTime as datetime))) as [PesonId = 1 TimeSpan]
from @Table1
where PersonID = 1
and EntryTime > @LastDiff


-- Puting everything togheter
select t1.PersonId, datediff(minute, min(t1.StartTime + cast(t1.EntryTime as datetime)), max(t1.EndTime + cast(t1.EntryTime as datetime))) as TimeSpan
from @Table1 t1
where t1.EntryTime >
 (
    select top 1 t2.ContractStart
    from @Table2 t2
    where t2.PersonID = t1.PersonID
    and t2.ContractType != 
    (
       select top 1 t2b.ContractType from @Table2 t2b where t2b.PersonID = t2.PersonID order by t2b.ContractStart desc
    )
    order by t2.ContractStart desc
 )
group by t1.PersonId

스 니펫은 설명이 필요 없으며 다음을 제공합니다.

PersonId TimeSpan
-------- --------
       1    120
       2    1560
       3    3000

참고 더 나은 테스트 예제를 만들기 위해 몇 가지 데이터를 추가했습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Where 절에서 If Else를 사용하는 방법

분류에서Dev

WHERE 절에서 날짜 범위를 사용하는 방법

분류에서Dev

where 절에서 mysql 추출 연도를 사용하는 방법

분류에서Dev

Where 절에서 TimeDiff 함수를 사용하는 방법

분류에서Dev

WHERE 절에서 CASE를 사용하는 방법

분류에서Dev

mysql의 WHERE 절에서 OR & AND를 사용하는 방법

분류에서Dev

WHERE 절에서 MySql MAX ()를 사용하는 방법

분류에서Dev

SQL의 Where 절에서 View 요소를 사용하는 방법

분류에서Dev

while 루프를 사용하는 방법

분류에서Dev

While 루프에서 사전을 사용하는 방법?

분류에서Dev

while 루프에서 pow ()를 사용하는 방법은 무엇입니까?

분류에서Dev

C ++ while 루프에서 스레드를 올바르게 사용하는 방법

분류에서Dev

while 루프 내에서 변수를 동적으로 사용하는 방법

분류에서Dev

where 절에서 사례를 사용하는 방법은 무엇입니까?

분류에서Dev

Codeigniter를 사용하여 뷰에서 WHERE 절을 실행하는 방법

분류에서Dev

HIVE를 사용하여 WHERE 문에서 OR 절을 그룹화하는 방법

분류에서Dev

WHILE 루프 내부에서 FOREACH 루프를 사용하여 여러 열을 만드는 방법

분류에서Dev

Laravel : 쿼리에서 Where 및 orWhere를 사용하는 적절한 방법

분류에서Dev

Laravel : 쿼리에서 Where 및 orWhere를 사용하는 적절한 방법

분류에서Dev

파이프 후 서브 쉘 내부에서 while 루프를 사용하는 방법

분류에서Dev

Where 절을 사용하여 Neo4j에서 특정 하위 그래프를 찾는 방법

분류에서Dev

RXJS 구독 내에서 While 루프를 구현하는 방법

분류에서Dev

SQL에서 While 루프를 피하는 방법

분류에서Dev

WHILE EXISTS () 루프에서 변수를 할당하는 방법

분류에서Dev

while 루프에서 삭제를 처리하는 방법

분류에서Dev

자바 스크립트에서 while 루프를 사용하여 숫자를 인쇄하는 방법

분류에서Dev

C에서 while 루프를 사용하여 배열 요소를 추가하는 방법은 무엇입니까?

분류에서Dev

while 루프를 사용하여 Linux에서 상태를 확인하는 방법은 무엇입니까?

분류에서Dev

리드 지연 함수를 사용하여 mysql의 where 절에서 별칭을 사용하는 방법

Related 관련 기사

  1. 1

    Where 절에서 If Else를 사용하는 방법

  2. 2

    WHERE 절에서 날짜 범위를 사용하는 방법

  3. 3

    where 절에서 mysql 추출 연도를 사용하는 방법

  4. 4

    Where 절에서 TimeDiff 함수를 사용하는 방법

  5. 5

    WHERE 절에서 CASE를 사용하는 방법

  6. 6

    mysql의 WHERE 절에서 OR & AND를 사용하는 방법

  7. 7

    WHERE 절에서 MySql MAX ()를 사용하는 방법

  8. 8

    SQL의 Where 절에서 View 요소를 사용하는 방법

  9. 9

    while 루프를 사용하는 방법

  10. 10

    While 루프에서 사전을 사용하는 방법?

  11. 11

    while 루프에서 pow ()를 사용하는 방법은 무엇입니까?

  12. 12

    C ++ while 루프에서 스레드를 올바르게 사용하는 방법

  13. 13

    while 루프 내에서 변수를 동적으로 사용하는 방법

  14. 14

    where 절에서 사례를 사용하는 방법은 무엇입니까?

  15. 15

    Codeigniter를 사용하여 뷰에서 WHERE 절을 실행하는 방법

  16. 16

    HIVE를 사용하여 WHERE 문에서 OR 절을 그룹화하는 방법

  17. 17

    WHILE 루프 내부에서 FOREACH 루프를 사용하여 여러 열을 만드는 방법

  18. 18

    Laravel : 쿼리에서 Where 및 orWhere를 사용하는 적절한 방법

  19. 19

    Laravel : 쿼리에서 Where 및 orWhere를 사용하는 적절한 방법

  20. 20

    파이프 후 서브 쉘 내부에서 while 루프를 사용하는 방법

  21. 21

    Where 절을 사용하여 Neo4j에서 특정 하위 그래프를 찾는 방법

  22. 22

    RXJS 구독 내에서 While 루프를 구현하는 방법

  23. 23

    SQL에서 While 루프를 피하는 방법

  24. 24

    WHILE EXISTS () 루프에서 변수를 할당하는 방법

  25. 25

    while 루프에서 삭제를 처리하는 방법

  26. 26

    자바 스크립트에서 while 루프를 사용하여 숫자를 인쇄하는 방법

  27. 27

    C에서 while 루프를 사용하여 배열 요소를 추가하는 방법은 무엇입니까?

  28. 28

    while 루프를 사용하여 Linux에서 상태를 확인하는 방법은 무엇입니까?

  29. 29

    리드 지연 함수를 사용하여 mysql의 where 절에서 별칭을 사용하는 방법

뜨겁다태그

보관