создание сложного запроса SQL - PullRequest
0 голосов
/ 25 ноября 2011

Я новичок в 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

Я хочу следующее:

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

Я не знаю, нужно ли мне писать sproc (T-SQL) или есть какие-то встроенные ключевые слова в SQL, используя которые я могу получить желаемый результат. Я не могу создать новую таблицу, но представления, sprocs разрешены в моей существующей схеме.

Пожалуйста, помогите мне.

ТИА

Ответы [ 2 ]

2 голосов
/ 25 ноября 2011

Структура стола там ужасная, я бы сделал все, что ты мог, чтобы избежать этого. При этом в mssql есть несколько функций для подстрок, которые вы можете использовать.

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

Это даст вам все открытые записи. Мы сделаем то же самое, чтобы получить все закрытые записи в секунду. Это будет связано с чтением открытых и закрытых

Второй вопрос, который необходимо решить, - это выборка столбца «день» из этого текста. Каждый день заканчивается на y и не содержит в себе никаких других y, поэтому мы можем использовать charindex

lil disclaimer ... У меня нет базы данных mssql, доступной для тестирования, так что я могу быть здесь и там.

 select charindex('y',dayoftheweek)

Это вернет местоположение в строке символа 'y'.

Понедельник открыт у 6-го символа

select left('mondayopen',6)

Это вернет 6 левых символов mondayOpen или mondayClose. Соедините их вместе:

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

Надеюсь, я понял это правильно ... это должно привести к открытию понедельника и понедельника к понедельнику. Соедините их вместе:

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

Теперь должно возвращаться день недели без «открытия» или «закрытия» вместе с временем открытия. Превратите его в подзапрос, присоедините его к подзапросу close и соедините:

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 голосов
/ 25 ноября 2011

Конечно, это очень плохой дизайн базы данных. Для хранения дат необходимо использовать типы DATE и 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...