1

私は2つのテーブルを持っています、

学生:

rollno  | name 
1       | Abc
2       | efg
3       | hij
4       | klm

出席:

name | date       |status
Abc  | 10-10-2013 | A
efg  | 10-10-2013 | A
Abc  | 11-10-2013 | A
hij  | 25-10-2013 | A

私の必要な出力は次のとおりです。

where 条件を「'10-09-2013' と '13-10-2013' の間の日付」とするクエリ

rollno| name |count
1     | Abc  | 2
2     | efg  | 1
3     | hij  | 0
4     | klm  | 0

私は使用してみました:

SELECT p.rollno,p.name,case when s.statuss='A' then COUNT(p.rollno) else '0' end as count 
from    attendance s 
        right outer join student p 
            on s.rollno=p.rollno 
where   s.date between '10-09-2013' and '13-10-2013' 
group by p.rollno,p.regno,p.name,s.statuss 
order by p.rollno

出力は次のとおりです。

rollno| name |count
1   | Abc  | 2
2   | efg  | 1

学生テーブルの残りの値も追加したいと思います。さまざまなクエリを試しましたが、すべて失敗しました。上記の必要な出力を返すクエリはありますか?

4

1 に答える 1

2

条件を where から join に移動する必要があります。

SELECT p.rollno,p.name,case when s.statuss='A' then COUNT(p.rollno) else 0 end as count 
from    attendance s 
        right outer join student p 
            on s.rollno=p.rollno 
            and s.date between '10-09-2013' and '13-10-2013' 
group by p.rollno,p.regno,p.name,s.statuss 
order by p.rollno;

現時点では、外部結合がありますが、where 句で外部テーブルを参照することで、効果的に内部結合に変換できます。に一致がない場合はattendances.Dateなり、 行間に がないNULLため除外されます。NULL'10-09-2013' and '13-10-2013'

質問からは明らかではありませんが、実際に探しているのはこれだと思います。あなたは、学生によるステータス = 'A' の出欠数のエントリの直後に表示されます。

SELECT  p.rollno,
        p.name,
        COUNT(s.statuss) as count 
from    attendance s 
        right outer join student p 
            on s.rollno=p.rollno 
            and s.date between '10-09-2013' and '13-10-2013' 
            AND s.statuss = 'A'
group by p.rollno,p.regno,p.name,
order by p.rollno;

group by から s.statuss を削除し、生徒ごとにステータスごとに 1 行ではなく、生徒ごとに 1 行だけになるようにカウントを変更しました。カウント内の列を出席ステータス テーブルの列に変更して、出席エントリがない場合にカウントが 0 になるようにしました。学生の列を使用すると、エントリがない場合でもカウントが 1 になります。最後に、エントリのみに関心があるstatuss = 'A'ため、これも結合条件に移動しました。

最後に、日付に文字列を使用する場合は、カルチャに依存しない形式を使用することをお勧めしますyyyyMMdd。これは完全に明白であるため、20130201' is always the 1st February, and never 2nd January, whereas in your query10-09-2013' は設定に応じて 9 月 10 日または 10 月 9 日になる可能性があります。

于 2013-09-30T15:49:27.660 に答える