0
0

はじめに

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分

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0