1

私は SQL (初心者プログラマー) を初めて使用するので、これが簡単な質問のように思えるかもしれませんが、申し訳ありません。私の Web サイトで、学生に関する情報とともに最低 10 の成績を表示するテーブルを作成しようとしています。この点に関してはかなり満足していますが、書き込み SQL クエリのコーディングに問題があります。SQL Server 2008 を使用しています。

データベースに 10 列と 500 行のテーブルがあります。これらの列のうち 2 つには成績が含まれています (grade1 と grade2)。私の目標は、TOP 10 の最も低い GRADE1 を Web サイトのテーブルに表示することですが、GRADE1 が NULL の場合、GRADE2 を考慮して代わりに表示したいと考えています。つまり、Billy という名前の生徒が GRADE1 (NULL) を持っていないが、彼の GRADE2 がすべての中で最低 (GRADE1 と GRADE2 を合わせたもの) である場合、彼はリストの最初にいるはずです。

このタスクを達成できるクエリを作成するのを手伝っていただければ幸いです。解決策を調査してきましたが、さらに混乱するだけでした。

4

5 に答える 5

1

使用するSQL ServerでisNull()

SELECT TOP 10 isNull(grade1,grade2) AS `Grade`
FROM mytable
ORDER BY Grade DESC
于 2013-03-08T19:16:16.470 に答える
1

order by 句で case を使用できます

select top 10 * 
from students 
order by case when grade1 is null then grade2 else grade1 end desc

編集

BillyCode のコメントに続いて、表に 3 回以上出現する生徒のみを含めることについて、私はこれを提案します。

select top 10 s.*  
from students s
inner join (select StudentId, Count(*) as total from students) c on s.StudentId = c.StudentId  
where c.total >= 3
order by case when grade1 is null then grade2 else grade1 end desc

しかし、サブクエリに参加できるかどうかはわかりません。

于 2013-03-08T19:17:43.103 に答える
0

COALESCE関数はあなたが望むことをします。nullでない場合、またはnullの場合COALESCE(GRADE1, GRADE2)に表示されます。GRADE1GRADE2GRADE1

したがって、の代わりにORDER BY GRADE1ORDER BY COALESCE(GRADE1, GRADE2)

の詳細については、こちらをご覧くださいCOALESCE

于 2013-03-08T19:13:22.500 に答える
0

もう 1 つの方法は、まず成績が最も低い 10 人の生徒を見つけることです1。grade1 の名前を grade に変更します。そして、成績が最も低い 10 人の生徒を見つけます2。grade2 の名前を grade に変更します。その後、これら 2 つの結果が結合されます。そこから、成績が最も低い 10 人の生徒を見つけます。SQL は次のようなものです。

SELECT id, grade
FROM   (SELECT   id, grade1 AS grade
        FROM     students
        ORDER BY grade1 DESC
        LIMIT 10
        UNION
        SELECT   id, grade2 AS grade
        FROM     students
        ORDER BY grade2 DESC
        LIMIT 10)
ORDER BY grade DESC
LIMIT 10
于 2013-03-09T16:04:58.593 に答える
0

これを試して:

select Top 10 
student , (case when grade1 is null then grade2 else grade1 end ) as g1 , grade2 as g2 from table order by g1 desc
于 2013-03-08T19:16:41.007 に答える