挑戦的な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

私は次のことが欲しい。

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

私はsproc(T-SQL)を書く必要があるかどうか、あるいはSQLに組み込みのキーワードがあるかどうかはわかりません。どのキーワードを使って出力を得ることができますか?私は新しいテーブルを作成することはできませんが、ビュー、sprocsは私の既存のスキーマで許可されています。

私を助けてください。

TIA

0
すべての行に id = 1 がありますか? 'monday'を含む dayoftheweek の列とは別に、 'monday'行をグループ化するものはありますか?
追加された 著者 Kirk Broadhurst,

2 答え

テーブルの構造は恐ろしいですが、私はあなたがそれから逃げることができる何かをします。 mssqlには、あなたが使用できるいくつかの部分文字列関数があります。

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

これにより、開いているすべてのレコードが表示されます。私たちは同じことをして、閉じられたすべてのレコードを1秒で取得します。それは開かれた読者と閉じられた読者の挑戦によって得られるでしょう

第2の問題は、そのテキストから「日」の列を選ぶことです。毎日yで終わり、それに他の 'y'は含まれないので、charindexを使うことができます

Lil免責事項...私はテスト用のmssql dbを用意していないので、私はこことかそこにいないかもしれません。

 select charindex('y',dayoftheweek)

これは 'y'文字列の中の位置を返します。

Mondayopenには6番目の文字にyが付きます

select left('mondayopen',6)

これは、mondayOpenまたはmondayCloseの左の6文字を返します。 2つをまとめる:

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

私はそれが正しいことを望む...それはmondayopenとmondaycloseを月曜日に回すべきである。 2つをまとめる:

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

これで、開いている時間と一緒に '開いた'または '閉じる'のない日の週が戻されるはずです。サブクエリに変換し、それをクローズサブクエリに結合し、まとめてください:

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

私はそこに構文エラーがないと思っています。それをテストするものはありませんし、タイプミスがあるかもしれません^^

2
追加された
私はおそらくテーブルエイリアスのためのオープンのような用語を使用すべきではないでしょうか?
追加された 著者 Twelfth,
いいえ、あなたはすべきではありません:-)あなたの素晴らしい考えに感謝します。私はこれを生産に入れました。
追加された 著者 BoCode,

もちろん、これは非常に悪いデータベース設計です。日付を保存するには、日付と時刻の種類を使用する必要があります。

これを試して:

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',''))
0
追加された