• ベストアンサー

SQLで2年連続で値が上昇した年を表示する

添付の表よりSQLのcase文を使用して2年連続でsaleが上がったyearを求めようと しています。 前年より上がった場合は以下のSQLで表示できたのですが 2年連続に上がった年を表示させようとするとうまく表示できません。 誰かご教授いただけないでしょうか? select year,sale from sales s1 where sale > (select sale from sales s2 where s2.year = s1.year -1) order by year

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

select s.year, s.sale from sales s join sales s1 on s1.year = s.year -1         join sales s2 on s2.year = s.year - 2 where s1.sale > s2.sale and s.sale > s1.sale order by year で、行けそうな気がしますけど。  書いてないことで推定した条件は、   yearフィールドには重複が無いこと。又は、適切な条件で一意化が出来ること。(この場合は、条件の付加が必要です。)   yearが初出又は、2年目の登場の場合には、2年前との比較のしようがありませんので、このような年度は表示しません。    やっていることは単純です。内部結合を使って  year, sale, year(-1), sale1(-1), year(-2), sale(-2)  という構造の結合テーブルを構成し、単純に二年前と前年、前年と今年の比較をしているだけです。

yoshi2519
質問者

お礼

ご回答ありがとうございました。 解説がとてもわかりやすくて 無事に解決しました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

列示の中にCASEの記述が無いような…。 select s1.year, s1.sale from sales s1, (select s2.year, s2.sale from sales s2, (select s3.year, s3.sale from sales s3 where s3.year = s2.year - 1 and s3.sales < s2.sales) where s2.year = s1.year - 1 and s2.sale < s1.sale) order by s1.year 未試験です。 あと、カンマの後ろには半角スペース入れると読み易いですよ

yoshi2519
質問者

お礼

お早いご回答ありがとうございます! 教えて頂いたSQLを実行してみたところ「FROM句の副問い合わせは別名を持たなければなりません」と表示されています。 少しの修正で表示できそうなので確認してみます。 case文を入れるのを忘れてました。すみません。 自分で考えていたのは以下の文で2年連続表示はまだできていない 状態です。 SELECT year ,CASE WHEN sale = (SELECT sale FROM sales s2 WHERE s1.year = s2.year + 1) THEN '=' WHEN sale > (SELECT sale FROM sales s2 WHERE s1.year = s2.year + 1) THEN '+' END AS var FROM sales s1 ;

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 直近2年度連続で減少していない年度を抽出

    以下のテーブルの様に時系列が抜けているテーブルから直近2年度連続で減少していない年度を 抽出しようとしています。 /* year|sale --------- 1990|50 1992|50 1993|52 1994|55 1997|55 */ /* CREATE TABLE sales2 (year INTEGER NOT NULL , sale INTEGER NOT NULL , PRIMARY KEY (year)); INSERT INTO sales2 VALUES (1990, 50); INSERT INTO sales2 VALUES (1992, 50); INSERT INTO sales2 VALUES (1993, 52); INSERT INTO sales2 VALUES (1994, 55); INSERT INTO sales2 VALUES (1997, 55); */ 以下の記述で直近の年度までなら表示できているとは思うのですが2年連続となると やり方が思いつきません。誰かご教授いただけないでしょうか? select year,sale from sales2 s1 where sale >=(select sale from sales2 s2 where s2.year = (select max(year) from sales2 s3 where s1.year > s3.year)) order by year ;

  • SQL 句の評価順

    SQL句の評価順について皆さんの意見をいただけないでしょうか? <ケース1:SELECTが最後> ・FROM ・WHERE ・GROUP ・HAVING ・ORDER ・SELECT <ケース2:SELECTがトップ> ・SELECT ・FROM ・WHERE ・GROUP ・HAVING ・ORDER <ケース3:ORDERの前にSELECT> ・FROM ・WHERE ・GROUP ・HAVING ・SELECT ・ORDER どのケースで評価されますでしょうか? ご教授お願いします。

  • 秀丸でSQLを書く際に SQLの予約語だけ大文字

    秀丸でSQLを書く際に SQLの予約語だけを、大文字に変換するよい方法は? たとえば select * from table_1 where id=1 order by id desc; と書いて、マクロを起動すると SELECT * FROM talbe_1 WHERE id=1 ORDER BY id DESC; となるようにするよい方法はありませんか? また、予約語が「強調」されると尚良いです。

  • SQL得意な方

    仕事で困っています、 なにとぞお力添えを。 テーブル1から、TOP50 でaとbを表示させたいのです。 で、その際の条件として、 開始するレコードも指定したいのです。 下記SQLの[○]の部分に50が入っていたら、 51~100件を表示する、と、いうような。 SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a で、順調だったのですが、WHERE条件が なんだか怪しいらしく、 a >= ''の時だけはきちんと動くのですが、 ANDでc='1'をつけた所、普通に全件表示されてしまいます。 [ちゃんと51件目から100件目を表示するSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a [何故か全件表示になるSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a ※[何故かNOT IN (~)の部分がまったく働いていない] どうしてなのでしょう?。 解りにくい質問で大変申し訳ないのですが どなたかご教授いただけないでしょうか。

  • SQLの書き方を教えて!

    select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd のようにSUMで集計を行うSQLを発行する時に,同時にkingak順にsortすることは可能なのでしょうか? select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd order by SUM(kingak) としたいところですが,これではエラーになりますね。 SQLでは解決できないんでしょうか?

  • 以下のSQLにWHEREで指定することは可能でしょうか?

    select * from oshiete order by goo limit 0, 3 ; というSQL文があります。これにWHEREで指定したいのですが、なかなかできません。どのようにしたらよいのでしょうか?

    • ベストアンサー
    • MySQL
  • sql offset

    offsetやlimitをつけると 結果が表示されなくなります。 $sql='SELECT naiyo FROM zyoho WHERE cityid=? OR brandid=? だけのSQLだと結果は表示されるのですが。 解決方法をご教授お願いいたします。 下記はソースです。 $page=1; $limit=2; $offset = $limit * ($page - 1); $lastpage = ceil($total / $limit); if($brandid=='') { $sql='SELECT naiyo FROM zyoho WHERE cityid=? OR brandid=? ORDER BY `code` DESC LIMIT'.$limit.' OFFSET '.$offset.''; }else{ $sql='SELECT naiyo FROM zyoho WHERE cityid=? AND brandid=?ORDER BY `code` DESC LIMIT'.$limit.' OFFSET '.$offset.''; } $stmt=$dbh->prepare($sql); $data[]=$cityid; $data[]=$brandid; $stmt->execute($data); $dbh = null;

    • ベストアンサー
    • MySQL
  • SQLの結果が返ってこない

    PHP+mysqlで以下のようなSQL文で処理を行ったのですがデータが返ってきません。 $sql = 'SELECT * FROM books WHERE id=3'; $recordSet = mysql_query($sql); if(mysql_fetch_assoc($recordSet)){ while ($table = mysql_fetch_assoc($recordSet)) {        処理     } } mysqlの画面で SELECT * FROM books WHERE id=3 を入力してみるとしっかりと結果が返ってきます。 ちなみに1行目を、違うテーブルの $sql = 'SELECT * FROM podcast WHERE code=3 ORDER BY dcdate DESC LIMIT 0,3'; にしてみると、データが表示されます。 2日間かけてずっと試行錯誤してみたのですが、完全に行き詰ってしまったので、何か考えられる原因はありませんでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • sql文について

    sql文のswichをif分で変更したい。 下記のswitch文のlimitの範囲をユーザーが<a href="sqlpage1.php?sex=男&p=2">2ページ目</a>,<a href="sqlpage1.php?sex=男&p=3">3ページ目</a>,<a href="sqlpage1.php?sex=男&p=4">4ページ目</a>・・・・・・などを選択しクリックした場合にlimitの範囲を変更したいのですが(例 1ページ目・0~10、2ページ目・11~20、3ページ目・21~30、4ページ目・31~40・・・・・・) if文はどう書けばいいですか? ページはcssが一緒なので変えなくていいかなと思い一緒にしました。 以下、デフォルト(sqlpage1.php?sex=男&p=1)のものです。 switch($_REQUEST['sex']) { case 男; $sql = 'SELECT * FROM human where sex="男" order by limit (0,10)';ここを変更したい。 break; case 女; $sql = 'SELECT * FROM human where sex="女" order by limit 0,10'; break; case 中性; $sql = 'SELECT * FROM human where sex= "中性" order by limit 0,10'; break; }

    • ベストアンサー
    • MySQL
  • sqlのテーブル名省略について

    内部SQLで使用している「employee」表を「emp」とし、内部SQL実行結果を「emp」としています。 この場合、大外のSQLで使用している「emp」は、「emploheeを指すemp」か、「内部SQL実行結果を指すemp」なのかわかりません。 ご教授よろしくお願いします。 select emp.name,   emp.year, emp.day from (select name, year, day from employee emp where ~ GROUP BY name, year, day) emp where ~ GROUP BY emp.name, emp.year, emp.da /