はじめに
TOPSIC様が運営しているSQLコンテストの第13回目が2024年6月21日12時から24日12時までの間で開催されます。まだ間に合いますよ!
今回も参加しましたが反省点が多かったため、各コンテストの1問目を解いてみました。
コンテストは毎回4問出題され、問題ごとに難易度が上がっていきます。
今回は全て1問目のため、難易度はかなり優しめです。
自分のため、他の方の参考のため解答時間も計測したので記載します。(秒数は切り上げます。)
まとめ
今回得た学びを下記にまとめます。
文字列Sに文字Aが含まれているレコードを検索する場合
--文字Aが2文字以上含まれている条件
where S like '%A%A%'
--1文字の条件
where S like '%A%'
--先頭
where S like 'A%'
--語尾
where S like '%A'
--文字Aが1文字かつ文字Bが2文字かつ文字Cが3文字
where S like '%A%'
and S like '%B%B%'
and S like '%C%C%C%'
絶対値の取得はABS()で行える。
where ABS(c.SCORE1 - c.SCORE2) >= 20
第1回 SQLコンテスト
select
DISTRICT_CODE as 地区コード,
DISTRICT_NAME as 地区名,
TOTAL_AMT as 総人口
from
POPULATION
order by
総人口 desc,
地区コード desc
解答時間:2分
第2回 SQLコンテスト
update
POPULATION
set
DISTRICT_NAME = '不明'
where
DISTRICT_NAME is null
or DISTRICT_NAME = ''
解答時間:2分
第3回 SQLコンテスト
select
PF_CODE as CODE,
TOTAL_VALUE as SALES_AMT
from
CONVENIENCE
where
SURVEY_YEAR = 2019
and KIND_CODE = '100'
order by
SALES_AMT desc,
CODE asc
解答時間:2分
第4回 SQLコンテスト
select
EMP_CODE as CODE,
EMP_ENG_NAME as ENG_NAME
from
EMP
where
length(EMP_ENG_NAME) -
length(replace(lower(EMP_ENG_NAME), 's', '')) >= 2
order by
EMP_CODE asc
解答時間:5分
社員英字名にSまたはsが2回以上含まれるデータを取得する問題でした。
引き出しの差が出たなあと思いました。
他の方はwhere lower(EMP_ENG_NAME) like '%s%s%'
で対応されていました。
こちらの方がシンプルで可読性も良いですね。
第5回 SQLコンテスト
select
ITEM_CODE as ITEM,
ITEM_NAME as I_NAME,
CL_NAME as C_NAME,
SIZE_NAME as S_NAME
from
ITEM, SIZE_TBL, COLOR_TBL
where
STOCK_MANAGEMENT_TYPE = 1
order by
ITEM_CODE asc,
CL_CODE asc,
SIZE_CODE asc
解答時間:3分
解答速度を上げるためにCROSS JOINを省略して書いています。
あとはコンテストのサイトでコードテストができるのですが、エラーにならなかったのでテーブルのエイリアスも省略して提出しています。
第6回 SQLコンテスト
select
ITEM_POPULAR_RANK as RANK,
ITEM_CODE as CODE,
ITEM_NAME as NAME
from
ITEM
where
SALE_END_DATE is null
order by
ITEM_POPULAR_RANK asc,
ITEM_CODE asc
解答時間:2分
第7回 SQLコンテスト
select
EMP_CODE as CODE,
EMP_ENG_NAME as NAME,
length(EMP_ENG_NAME) as WORD_CNT
from
EMP
where
length(EMP_ENG_NAME) >= 15
order by
WORD_CNT desc,
EMP_CODE asc
解答時間:2分
第8回 SQLコンテスト
select
MEMBER_ID as ID,
c.SCORE1 - c.SCORE2 as DIFF
from
CONTEST_RESULTS c
where
c.SCORE1 - c.SCORE2 >= 20
or c.SCORE2 - c.SCORE1 >= 20
order by
DIFF desc,
ID desc
解答時間:3分
ABS()
で絶対値になるんですね。次から使います!
第9回 SQLコンテスト
select
EMP_CODE as CODE,
upper(EMP_ENG_NAME) as ENG_NAME
from
EMP
order by
1 desc
解答時間:2分
第10回 SQLコンテスト
select
EMP_CODE as CODE,
"'" || TRIM(EMP_KANA_NAME, '_') || "'" as KANA_NAME
from
EMP
order by
1 desc
解答時間:5分
第11回 SQLコンテスト
delete from
STOCK
where
LAST_DELIVERY_DATE between '2023-01-01' and '2023-01-31'
and ACTUAL_AMT = 0
解答時間:1分
第12回 SQLコンテスト
insert into DEPARTMENT
values (
'1100',
'2024-04-01',
NULL,
'営業1課',
2,
'1000',
'1',
'TANAKA',
'2024-04-01 00:00:00'
),
(
'2200',
'2024-04-10',
NULL,
'製造2課',
2,
'2000',
'1',
'YAMADA',
'2024-04-10 00:00:00'
)
解答時間:3分