banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

[SQL] 2つの学校の索迪杯ソフトウェアコンテスト予選試験問題のSQL文

今日は学校の索迪カップ予選試験に参加しましたが、試験問題に書かれている日本語に困惑しました。この試験で日本語を試されるの?まるでアメリカの GRE 試験で『論語』を試されるようなもので、本当に変態です!しかし、皆さんと共有する価値のある 2 つのクラシックな SQL の問題があります。初心者向けで SQL を学ぶのに適しています。私も初心者の一人ですが、問題を見てみましょう。

問 1: SQL を使用して、今年または特定の年がうるう年かどうかを判断する。説明: SQL?うるう年?これらはあまり関係がないように思えますが、試験で日本語を試されるのと同じくらい、試験官には感心します。しかし、SQL Server 2000 を使用したことがある人は、おそらく NOW () という関数を知っているでしょう。最初は私もそう思っていましたが、now () には使い物にならない情報が含まれており、処理が面倒です。そこで、別の関数 GETDATE () を思いつきました。現在の MSSQL2000 では使用できますが、他のバージョンではわかりません。ユーザーマニュアルを参照してください。GETDATE () は今日の日付を返します。

例えば:

SELECT GETDATE() AS DATE

結果は:

Dec 18 2008 22:20PM

日付と時間が含まれています。では、年だけを取得しましょう。

さらに、日付を切り取るための関数 DATEPART () を紹介します。

関数名からわかるように、特定のインデックスでデータを切り取るためのものです。私が現時点で知っているのは、年と月が使用できることです。詳細はユーザーマニュアルを参照してください。

使用方法は次の通りです:

DATEPART(month, GETDATE())

では、うるう年をどのように判断すればよいでしょうか?年が 4 で割り切れ、かつ 100 の倍数でない場合はうるう年です。100 の倍数の場合は、400 で割る必要があります。

したがって、次のように判断できます。

DECLARE @year INT
IF (@YEAR % 4 =0 AND @YEAR %100 <> 0) OR (@YEAR % 400 = 0)
SELECT 'YES'
ELSE
SELECT 'NO'

以上から、以下の SQL 文が得られます。

DECLARE @year INT

SET @year = DATEPART(month, GETDATE())

IF (@YEAR % 4 =0 AND @YEAR %100 <> 0) OR (@YEAR % 400 = 0)
SELECT 'YES'
ELSE
SELECT 'NO'

問 2: 学生の成績表 (SCG) には、学生 ID (SID、int)、科目 ID (CID、int)、成績 (grade、int) の列が含まれています。これらの学生の成績の中で、各科目の上位 2 名を学生番号で並べ替えて求める。成績が同点の場合は考慮しない。

分析すると、TOP 2 を求めれば良いです。また、具体的な科目ごとに分析する必要があります。複数の科目の成績が含まれるため、多段階のネストされたクエリが必要で、効率は低いかもしれません。もし他に良いアイデアがあれば、コメントで議論してください。

以下は SQL 文です。

SELECT t.SID AS 学生 ID, t.CID AS 科目 ID, t.grade as 成績
FROM SCG AS t
WHERE grade IN
(
SELECT TOP 2 grade
FROM SCG
WHERE
t.CID = SCG.CID
ORDER BY grade DESC
)
ORDER BY SID

* 注:' 汉子 ' さんの指摘により、一部の文を修正しました。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。