• ベストアンサー

SQL GROUP BY

SQLについてお聞きしたいです。番号カラムの中で最大の数字をもつフィールドと 同じコードを持つデータを、表から全て取得したいと思っているのですが 書き出すとGROUP BYの式が間違っているというエラーが出てしまいます。 SELECT * FROM 表 GROUP BY コード HAVING MAX(番号) = コード どう調べればいいのか分からず四苦八苦しています。どこを直せばよいでしょうか?

  • Oracle
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • eisai
  • ベストアンサー率36% (14/38)
回答No.1

SELECT * FROM 表 WHERE コード IN( SELECT コード FROM 表 GROUP BY コード HAVING MAX(番号) = コード ); でどうでしょうか。 GROUP BYを使うときは、SELECTするカラムと同一でなくてはなりません。 もうちょっといい方法もあるように思いますが。

kp-umum
質問者

お礼

ありがとうございます! 試してみます

kp-umum
質問者

補足

ありがとうございます。参考にさせていてだき書き直してみましたが 右カッコがありませんとエラーになってしまいました…

その他の回答 (2)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

SELECT * FROM 表 WHERE コード = ( SELECT コード FROM (SELECT コード, 番号, MAX(番号) OVER() max番号 FROM 表) WHERE 番号 = max番号 ); とかでしょうか。

kp-umum
質問者

お礼

ありがとうございます! 試してみます

回答No.2

SELECT * FROM 表 WHERE 番号=(SELECT MAX(番号) FROM 表) です。

kp-umum
質問者

お礼

ありがとうございます! 試してみます

kp-umum
質問者

補足

ありがとうございます。コードはどこに入れ込めばよいでしょうか?

関連するQ&A

  • SQLでグループ化した結果の件数を求めるには?

    下記のようなグループ化した結果を表示するSQL文を作りました。 SELECT メーカコード FROM 部品表 GROUP BY メーカコード, 部品番号 HAVING ((部品番号)="BUHIN1") これを実行するとちゃんと結果が出るのですが、その結果の件数を求めるにはどのようなSQL文を追加すれば宜しいのでしょうか? COUNT文を使うと出来そうなのですが、 SELECT メーカコード, COUNT(メーカコード) AS CNT FROM 部品表 GROUP BY メーカコード, 部品番号 HAVING ((部品番号)="BUHIN1") とやるとメーカコードの個別件数が表示されてしまいます。 どうぞよろしくお願いします。

  • グループ化したSQLの書き方について

    id,stpass,tokuten,branch,dateというフィールドをもつresultというテーブルを作成しました。 最高得点(フィールド名:tokuten)は、下記SQL(クエリーで作りました)でできます。 SELECT result.id, result.stpass, Max(result.tokuten) AS tokutenの最大 FROM result GROUP BY result.id, result.stpass; ただ、最高得点(Max(result.tokuten) AS tokutenの最大)を出したと同じレコードのそれ以外のフィールド(branch,date) を表示させるSQL(クエリー)がわかりません。 何方か、ご存知の方おられましたら、ご教授ください。

  • SQLの書き方

    SQLの書き方 SQL初心者なのですが、わからないことがあるので教えてください。 表Employees (EmployeeID,EmployeeName) 表Salary (PayDate,Amount,EmployeeID) という2つの表があるときに、次の問題があります。 問題:表Employeesから各EmployeeIDについて、SalaryのAmountの最高が300,000以上のデータを取り出し、EmployeeID,EmployeeName,Amountの最高額を表示しなさい。 答えが SELECT EmployeeID ,EmployeeName ,( SELECT MAX(Amount) FROM Salary WHERE EmployeeID=Employees.EmployeeID /*GROUP BY EmployeeID*/ ) FROM Employees WHERE EmployeeID IN ( SELECT EmployeeID FROM Salary GROUP BY EmployeeID HAVING MAX(Amount)>=300,000 ) ; となるのですが、/*と*/の間の文がいらないのはなぜですか?選択リストの中の副問い合わせで、MAX(Amount)というのがあるのでグループ化しなければならないと思うのですが、よくわかりません。

  • SQLについて

    SELECT YKC.code FROM ( SELECT code,seq FROM Ctable C,Dtable D WHERE C.num = D.num AND C.DATE <= '05/01/01' ) YKC GROUP BY code,seq HAVING YKC.seq = MAX(YKC.seq) のように記述したのですが、 HAVING YKC.seq = MAX(YKC.seq)の部分が働いてくれず 複数行取ってきてしまいます。 seqがMAXの1行だけを取得したい場合、 どのようなSQLにすれば良いでしょうか?

  • SQLのcount()とgroup by

    以下のようなテーブルがあったとき、 tbl1 id | score 1 | 100 1 | 200 1 | 300 2 | 200 2 | 100 3 | 300 3 | 400 3 | 500 3 | 600 idでまとめて個数を出すとすると、 SELECT count(*) FROM tbl1 group by id とすれば count(*) 3 2 4 と結果が返ってきますが、この結果にidを足して id | count(*) 1 | 3 2 | 2 3 | 4 というようなSQLはどうやって書けばいいのでしょうか? MySQLでは、 SELECT id, count(*) FROM tbl1 group by id と書けるのですが、これは標準的なSQLではNGなそうなので、気になって質問しました。 よろしくお願いします。

  • OUTER JOIN とgroup by

    こんにちは。 mysqlのselect文なのですが、LEFT OUTER JOIN した右側をgroup byし、そのなかで最大値を持つものを結び付けたいのですが、四苦八苦やってみたところ2日ほど解決できず・・・。 どなたかご教授いただけますと助かります。 テーブルなどは以下の通りです。 ---tableA----(テーブル名) user / supplier(カラム名、以下レコード) 1 / 1 1 / 2 1 / 3 2 / 1 2 / 3 ---tableB--- skuno / supplier / update_at 1 / 1 / 2011-12-12 2 / 1 / 2011-12-13 3 / 1 / 2010-11-10 検索の目的は、特定のカラムuserに対応する(例えばuser = 1)supplierの値(1,2,3)を取り出し、tableBにおいて、それぞれの値に結びつくskunoのうち最新のupdate_atを持つskunoを取り出したいというものです。 上記の例の場合、希望する検索結果は以下のような想定です。 supplier / skuno 1 / 2 2 / null 3 / null 私が検討してみたsql文は以下の通りなのですが、 select supplier,skuno from tableA LEFT JOIN tableB ON tableA.supplier = tableB.supplier where tableA.user = 1 and tableB.update_at IN (select max(update_at) from tableB group by supplier) group by tableA.supplier; この場合だと、右側がnullだとsupplierの値が表示されず、 supplier / skuno 1 / 2 となってしまいます。 select supplier,skuno from tableA LEFT JOIN tableB ON tableA.supplier = tableB.supplier where user = 1 group by supplier; だと右側のテーブルの値が指定できず・・・ ここからどのように条件付けをしたらよいのか、お力添えをいただけますと幸いです。 よろしくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • SQLのパラメータ・・

    たびたびお世話になっております。 顧客マスタの新規コードを、最大値に1を足して生成しています。 既存の顧客コードの最大値を求める為、 Dim mySQL as Stirng,Rst as Recordset mySQL="SELECT Max(局コード) AS 局コードの最大, 会社コード FROM 顧客マスタ GROUP BY 会社コード HAVING (会社コード=[Forms]![フォーム]![テキスト1]);" Set Rst = CurrentDB.OpenRecordset(mySQL) というSQL文をかきました。 ところが、SQLをレコードセットにすると「パラメータが少なすぎます。1を指定してください(3061)」というエラーメッセージが出てしまいます。 クエリーを作成して実行しても正しい結果を返すのに、SQLだとダメなのはなぜなのでしょうか。 どうぞよろしくお願いいたします。

  • 相関サブクエリの中で、グループ化はできない?

    いつもお世話になっています。 オラクルではないのですが、SQLの質問が多く感じたため、質問させていただきました。 タイトルの通り、相関サブクエリはグループ化した状態で行えるのか教えていただきたいんです。 課題は、売上表(Sales)から、売上数量(Quantity)の平均の10倍よりも売上数量(Quantity)の最大の方が大きい商品IDを見つけ出す。というものです。 考えたSQLは SELECT __S1.ProductID FROM __Sales AS S1 GROUP BY __ProductID HAVING __AVG(Quantity) * 10 < (SELECT    __MAX(Quantity)    FROM    __Sales AS S2    GROUP BY    __ProductID    HAVING    __S1.ProductID = S2.ProductID) です。考え方として 相関サブクエリで、現在の商品ID(HAVING S1.ProductID = S2.ProductIDのところ)の商品数量の最大値を比較として返そうと思いましたが、どうもうまくいきません。 こういった相関サブクエリは作れないのでしょうか?

  • グループ化したSQLの書き方について

    XP&MySQL5&PHP5 ID,PASSWORD,name,tokutenn,zyukennbi,syozoku,bangou というフィールド(すべてテキスト型)を持つテーブル(result)があります。 (ID,PASSWORD,名前、得点、受験日、所属、社員番号) 全個人が最高得点を記録したレコードだけはSQLで書けます。 select ID, name ,max(result.tokuten) as maxtokuten from result group by ID, name ただ、最高得点を出したと同じレコードのそれ以外のフィールド(zyukennbi,syozoku,bangou) を表示させるSQLがわかりません。 何方か、ご存知の方おられましたら、ご教授ください。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • SQL文のGROUPとORDERの順番

    こんににちは、 得点表(学生番号、科目コード、得点)があります。 得点表から各学生の合計得点を求めて降順に整列する場合の正解は、 SELECT 学生番号,SUM(得点) FROM 得点表 GROUP BY 学生番号 ORDER BY 2 DESC だったのですが、この2はSUM(得点)のことでしょうか? また、 SELECT 学生番号,SUM(得点) FROM 得点表 ORDER BY 2 DESC GROUP BY 学生番号 のようにGROUP と ORDER をひっくり返した場合、間違いになるのでしょうか? お分かりの方がいましたら教えてください。 よろしくお願いします。