2

作成したテーブルは次のとおりです。

CREATE TABLE Plane_new (Pnum char(3), Feature varchar2(20), Ptype varchar2(15), 
primary key (Pnum));

CREATE TABLE Employee_new (eid char(3), ename varchar(10), salary number(7,2), mid char(3),
PRIMARY KEY (eid), FOREIGN KEY (mid) REFERENCES Employee_new);

CREATE TABLE Pilot_new (eid char(3), Licence char(9), primary key (eid), 
foreign key (eid) references Employee_new on delete cascade);

CREATE TABLE FlightI_new (Fnum char(4), Fdate date, Duration number(2), Pid char(3), 
Pnum char(3), primary key (Fnum), foreign key (Pid) references Pilot_new (eid), 
foreign key (Pnum) references Plane_new);

そして、私が完了する必要があるクエリは次のとおりです。各フライトについて、その番号、フライトを実施したパイロットの名前、および飛行時間が平均より長かった場合は「平均より長い」という言葉、または「平均より短い」という言葉を表示します。飛行時間が平均以下だった場合。「平均より長い」または「平均より短い」という単語を含む列の場合、ヘッダーの長さを作成します。

これが私が思いついたものです-運が悪いです!

SELECT F.Fnum, E.ename,
CASE Length 
WHEN F.Duration>(SELECT AVG(F.Duration) FROM FlightI_new F)
THEN "Longer than average"
WHEN F.Duration<=(SELECT AVG(F.Duration) FROM FlightI_new F)
THEN 'Shorter than average' END
FROM FlightI_new F LEFT OUTER JOIN Employee_new E ON F.Pid=E.eid
GROUP BY F.Fnum, E.ename;

どこが間違っていますか?

4

3 に答える 3

0

このサンプル クエリを * SQLFiddleで見ていただけます か。多かれ少なかれ構文の問題だったのかもしれません。Case ステートメントの最後に使用する代わりに使用しますCase LengthAs Lengthただし、最適化に関してクエリに変更を加えていません。

SELECT F.Fnum, E.ename,
CASE 
WHEN F.Duration>(SELECT AVG(F.Duration) 
                 FROM FlightI_new F)
THEN Longer than average
WHEN F.Duration<=(SELECT AVG(F.Duration) 
                  FROM FlightI_new F)
THEN 'Shorter than average' 
END as Length
FROM FlightI_new F 
LEFT OUTER JOIN Employee_new E 
ON F.FPid=E.eid

私が使用したサンプルデータに従って、次の結果を提供します。あなたの「中間」列FOREIGN KEY (mid) REFERENCES Employee_new);が本当にどこかを参照しているかどうかはまだわかりません...そのため、参照整合性を削除してそのままにしました。

FNUM    ENAME   LENGTH
f001    kaen    Longer than average
f002    jerry   Longer than average
f003    dane    Longer than average
f004    jerry   Shorter than average
f005    kaen    Shorter than average
f006    tim     Shorter than average
f007    dane    Shorter than average
于 2012-11-21T05:06:45.550 に答える
0

次の行を置き換えます。

THEN "Longer than average"

この行で:

THEN 'Longer than average'

つまり、二重引用符を一重引用符に変更します。

于 2012-11-21T04:35:44.950 に答える
0
SELECT F.Fnum, E.ename,
(CASE F.Duration 
WHEN F.Duration>(SELECT AVG(B.Duration) FROM FlightI_new B)
THEN 'Longer than average'
ELSE 'Shorter than average' END) AS LENGTH
FROM FlightI_new F LEFT OUTER JOIN Employee_new E ON F.Pid=E.eid
GROUP BY F.Fnum, E.ename;
于 2012-11-21T04:33:15.750 に答える