2011-11-25 2 views
0

저는 SQL 서버의 초보자입니다.도전적인 SQL 쿼리 제작

나는 다음 표했습니다 나는

id dayoftheweek timeoftheday 
1 mondayOpen 0:00 
1 mondayClose 23:59 
1 tuesdayOpen 0:00 
1 tuesdayClose 23:59 
1 wednesdayOpen 0:00 
1 wednesdayClose 23:59 
1 thursdayOpen 0:00 
1 thursdayClose 23:59 
1 fridayOpen 0:00 
1 fridayClose 23:59 
1 saturdayOpen 0:00 
1 saturdayClose 23:59 
1 sundayOpen 0:00 
1 sundayClose 23:59 

을 다음 원하는 : (T-SQL) 나는 sproc에 작성해야하는 경우

 id day  open close 
    1 monday 0:00 23:59 
    2 tuesday 0:00 23:59 

내가 모르거나 경우가 SQL에 내장 된 키워드입니다.이 키워드를 사용하여 원하는 결과를 얻을 수 있습니다. 새 테이블을 만들 수는 없지만 뷰를 만들 수 있습니다. 기존 스키마에서 sprocs를 사용할 수 있습니다.

도와주세요.

TIA

+0

모든이있을 수 있습니다 행에'id = 1'이 있습니까? '월요일'을 포함하는 'dayoftheweek' 칼럼을 제외하고'월요일 '행을 그룹화하는 것이 있습니까? –

답변

2

테이블 구조는 무서운 존재, 당신이 그것에서 멀리 얻을 위해 할 수있는 아무것도 할 것입니다. 그건 mssql 당신이 사용할 수있는 몇 가지 하위 문자열 기능이있다.

select dayoftheweek, timeoftheday 'open' 
from uglytable 
where right(dayofweek,4) = 'Open' 

이렇게하면 열려있는 모든 기록을 볼 수 있습니다. 우리는 같은 일을하여 모든 닫힌 기록들을 잠깐 얻을 것입니다. 열린 대 열어 읽기의 도전에 의해 얻을 것이다

해결할 두 번째 문제는 해당 텍스트에서 '일'열을 선택하는 것입니다. 매일 y로 끝나고 그 안에 다른 'y'가 들어 있지 않으므로 charindex를 사용할 수 있습니다.

릴 면책 조항 ... 테스트를 위해 mssql db를 사용할 수 없으므로 char off 일 수 있습니다. 여기 저기에.

select charindex('y',dayoftheweek) 

'y'문자의 문자열로 위치가 반환됩니다.

Mondayopen는 mondayOpen 또는 mondayClose 왼쪽 6 개 문자를 반환 6 문자

select left('mondayopen',6) 

에 Y를 갖는다. 두 가지를 함께 넣어 :

select left(dayoftheweek,charindex('y',dayoftheweek)) 

희망은 내가 바로 ... 그것은 mondayopen 켜고 월요일에 mondayclose 것을 얻었다. 두 가지를 함께 넣어 :

select left(dayoftheweek,charindex('y',dayoftheweek)) dayofweek, timeoftheday 'open' 
from uglytable 
where right(dayofweek,4) = 'Open' 

이 이제 '열기'또는 오픈 시간과 함께 '가까운'없이 DAYOFWEEK를 반환해야합니다. , 하위 쿼리로 돌려 가까운 하위 쿼리에 가입하고 넣어 함께 :

select open.dayofweek, open.open,close.close 
from 
(select left(dayoftheweek,charindex('y',dayoftheweek)) dayofweek, timeoftheday 'open' 
from uglytable 
where right(dayofweek,4) = 'Open') open 
inner join 
(select left(dayoftheweek,charindex('y',dayoftheweek)) dayofweek, timeoftheday 'close' 
from uglytable 
where right(dayofweek,5) = 'Close') close 
on open.dayofweek = close.dayofweek 

희망 나는 거기에 테스트 아무 구문 오류가하지 않고 오타 ^^

+0

테이블 별칭에 대해 open과 같은 용어를 사용하면 안됩니다. – Twelfth

+0

아니요, 당신은하지 말아야합니다 :-)하지만 당신의 놀라운 생각에 감사드립니다.나는 이것을 생산에 넣었다. – BoCode

0

물론 이것은 매우 나쁜 데이터베이스 디자인입니다. 날짜를 저장하려면 DATE and TIME 유형을 사용해야합니다.

이 시도 :

declare @tbl table(id int, dayoftheweek varchar(50), timeoftheday varchar(10)) 
insert into @tbl values (1, 'mondayOpen', '0:00') 
insert into @tbl values (1, 'mondayClose', ' 23:59') 
insert into @tbl values (1, 'tuesdayOpen', ' 0:00') 
insert into @tbl values (1, 'tuesdayClose', ' 23:59') 
insert into @tbl values (1, 'wednesdayOpen', '0:00') 
insert into @tbl values (1, 'wednesdayClose', '23:59') 
insert into @tbl values (1, 'thursdayOpen', ' 0:00') 
insert into @tbl values (1, 'thursdayClose', '23:59') 
insert into @tbl values (1, 'fridayOpen', '0:00') 
insert into @tbl values (1, 'fridayClose', '23:59') 
insert into @tbl values (1, 'saturdayOpen', ' 0:00') 
insert into @tbl values (1, 'saturdayClose', '23:59') 
insert into @tbl values (1, 'sundayOpen', '0:00') 
insert into @tbl values (1, 'sundayClose', '23:59') 
insert into @tbl values (2, 'mondayOpen', '0:00') 
insert into @tbl values (2, 'mondayClose', ' 23:59') 
insert into @tbl values (2, 'tuesdayOpen', ' 0:00') 
insert into @tbl values (2, 'tuesdayClose', ' 23:59') 
insert into @tbl values (2, 'wednesdayOpen', '0:00') 
insert into @tbl values (2, 'wednesdayClose', '23:59') 
insert into @tbl values (2, 'thursdayOpen', ' 0:00') 


SELECT tOpen.id, tOpen.DayOfTheWeek, tOpen.timeoftheday OpenTime, tClose.timeoftheday CloseTime 
FROM (SELECT REPLACE(dayoftheweek,'open','') DayOfTheWeek, timeoftheday,id 
     FROM @tbl 
     WHERE LEN(REPLACE(dayoftheweek,'open',''))<LEN(dayoftheweek)) tOpen 
     JOIN 
     (SELECT REPLACE(dayoftheweek,'close','') DayOfTheWeek, timeoftheday,id 
     FROM @tbl 
     WHERE LEN(REPLACE(dayoftheweek,'close',''))<LEN(dayoftheweek)) tClose ON tOpen.DayOfTheWeek=tClose.DayOfTheWeek AND tOpen.id=tClose.id