• ベストアンサー

PostgreSQLで集約関数をネストしたい

質問させてください PostgreSQLでは集約関数をネストできないのでしょうか。 以下の命令を実行すると「集約関数をネストできない」というエラーになります。 SELECT RCT_NO, MAX(SUM(BUYNUM)) FROM TRN_RECEIPT_DETAILS GROUP BY RCT_NO 実行環境はPostGreSQL 8です。 解決策をご存知でしたらお教えください。

  • ryu-e
  • お礼率72% (202/278)

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

  • ベストアンサー
  • yukitakao
  • ベストアンサー率44% (16/36)
回答No.1

↓とかでどうでしょう? 試してないので微妙に間違ってる部分あるかも?だけれども。 SELECT MAX(sum_buynum) FROM ( SELECT RCT_NO, SUM(BUYNUM) AS sum_buynum FROM TRN_RECEIPT_DETAILS GROUP BY RCT_NO )

ryu-e
質問者

お礼

ありがとうございます。 以下のようにしたら動作しました。 SELECT MAX(sum_buynum) FROM (SELECT RCT_NO, SUM(BUYNUM) AS sum_buynum FROM TRN_RECEIPT_DETAILS GROUP BY RCT_NO ) AS P1;

関連するQ&A

  • 集約関数に対する条件??

    条件式の挿入に関して思った結果を出せずおり 質問させて頂きます 現在テーブルが二つあり以下のようになります t1(テーブル1) ============= id No(商品番号) ------------- 1 001 2 002 3 003 ============= t2(テーブル2) ====================== No(商品番号) day(入荷日) ---------------------- 002 2008/04/01 003 2008/02/22 003 2008/04/10 ====================== 商品に対して入荷回数(cnt)と最終入荷日(lastday)を知りたく select t1.id, count(t2.No) as cnt, max(t2.day) as lastday from t1 LEFT JOIN t2 on t1.No=t2.No group by t1.No; としました 結果1 ====================== No cnt lastday ---------------------- 001 0 002 1 2008/04/01 003 2 2008/04/10 ====================== 上のセレクトは「現在」の結果ですので 例えば2008/03/30現在の表記が欲しく select t1.id, count(t2.No) as cnt, max(t2.day) as lastday from t1 LEFT JOIN t2 on t1.No=t2.No where t2.day <= '2008/03/30' or t2.day is null group by t1.No; または select t1.id, count(t2.No) as cnt, max(t2.day) as lastday , t2.day from t1 LEFT JOIN t2 on t1.No=t2.No group by t1.No having t2.day <= '2008/03/30' or t2.day is null; とすると 結果2 ====================== No cnt lastday ---------------------- 001 0 003 1 2008/02/22 ====================== となります No:001 の情報(cnt:0)と同様に 希望結果 ====================== No cnt lastday ---------------------- 001 0 002 0 003 1 2008/02/22 ====================== No:002 cnt:0 の結果を残すのにはどのようなセレクト文を組んだらよいのでしょうか? 宜しくお願いいたします mysql 4.0 わかりやすい表題が思いつかず 表題と内容が食い違っているかもしれません 大変申し訳ありません

    • ベストアンサー
    • MySQL
  • ビュー(インラインビュー)で集約した結果と結合するSQLについて

    テーブルAを複数のキー項目で集約した結果と、テーブルBを結合しようとしています。 インラインビュー(もしくはビュー)で予め集約を行う、以下のようなSQLを考えました。 候補<1> MAX関数でTableA.列1を絞る select ... from (select max(列1),列2,列3,列4 from TableA group by 列2,列3,列4) TableA2,Table_B where TableA.列2=TableB.列2 and ...; 候補<2> ROW_NUMBER関数で列1の順位を取得し、Where句で順位=1とすることでTableA.列1を絞る select ... from (select 列2,列3,列4 from TableA group by 列2,列3,列4 row_number() over (partition by 列2,列3,列4 order by 列1) RN) TableA2,Table_B where TableA.列2=TableB.列2 and ... and RN=1; ※候補<1><2>で結果が異なることがありますが、ともかく 「インラインビュー(もしくはビュー)で予め集約を行う」がやりたいことです。 しかしこのようなクエリだと、インラインビューでもビューでも、 性能がでません。実行計画を確認したところ、TableA,TableBの結合で生成される レコードごとに毎回集約を行っているようで、膨大なクエリ数が発生していました。 ビューやインラインビューで上記のように集約を行うと危険、とはよく聞きますが... ビューやインラインビューで集約した結果をひとつのテーブルとみなして結合するなど、 レコードごとに集約を行わないようなノウハウがありましたら、お教え願います。

  • postgresql  DELETE後commit前にselect出来ますか?

    はじめまして。 postgreSQL 7.2.1  JAVA 1.3.1_04 を使用して開発しています。 あるPrimaryKEYのレコードを削除後 commit前に本当に削除されたか確認したいのですが select count(*)を実行すると下記のようなエラーになってしまいます。 No results were returned by the query. これはpostgresqlの問題なのでしょうか? どなたかご教授ください。 よろしくお願いいたします。

  • postgresql  DELETE後commit前にselect出来ますか?

    postgreSQL 7.2.1  JAVA 1.3.1_04 を使用して開発しています。 あるPrimaryKEYのレコードを削除後 commit前に本当に削除されたか確認したいのですが select count(*)を実行すると下記のようなエラーになってしまいます。 No results were returned by the query. これはpostgresqlの問題なのでしょうか? どなたかご教授ください。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • GROUP BYで集約されるときのソートを変えたい

    GROUP BYで集約されるときのソートを変えたい MySQLの5.1を使用しています。 テーブル"tbl"には、"no","id","score"の3つのフィールドがあり、 "no"は主キーです。 +---+----+-------+ | no | id | score | +---+----+-------+ | 1 | 10 | 10002 | | 2 | 10 | 10000 | | 3 | 10 | 10008 | | 4 | 11 | 10004 | | 5 | 12 | 10006 | +---+----+-------+ 上記の表から、 scoreの値が高い順にグループ化してソートしたいのですが、 以下のSQL文ではscoreが最初に登録されたものに集約されてからグループ化されてソートしてしまうため、 思い通りの結果が得られずに困っています。 ↓具体例 SELECT no, id, score FROM tbl ORDER BY score DESC GROUP BY id; +---+----+-------+ | no | id | score | +---+----+-------+ | 5 | 12 | 10006 | | 4 | 11 | 10004 | | 1 | 10 | 10002 | +---+----+-------+ ↓欲しいソート順 +---+----+-------+ | no | id | score | +---+----+-------+ | 3 | 10 | 10008 | | 5 | 12 | 10006 | | 4 | 11 | 10004 | +---+----+-------+ テンポラリテーブルはなるべく使用せずソートしたいのですが、 このような事は可能なのでしょうか? ご存知の方がいらっしゃいましたら教えていただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • PostgreSQLのphpPgAdminを使って

    お世話になります。 PostgreSQL8.4.8のphpPgAdmin3.5.3を使ってデータを削除する際に 先ずデータをSELECT で表示させて確認後、 SQL編集 で SELECTを DELETE に書き換えて実行しましたが以下エラーが出ます ≪一覧確認用≫一覧表示はできました。 SELECT "kaiin_no","tenpo_no","tenpo_name" FROM "public"."store_table" WHERE "kaiin_no" IN ('1234',2222'); ≪削除用≫SELECT  → DELETEに変更 → 実行 → 以下エラー DELETE "kaiin_no","tenpo_no","tenpo_name" FROM "public"."store_table" WHERE "kaiin_no" IN ('1234',2222'); ≪エラー内容≫ ERROR: syntax error at or near "," LINE 1: SELECT COUNT(*) AS total FROM (DELETE "kaiin_no","tenpo_no",... ^ 文: SELECT COUNT(*) AS total FROM (DELETE "kaiin_no","tenpo_no","tenpo_name" FROM "public"."store_table" WHERE "kaiin_no" IN ('1234','2222')) AS sub 文法エラーのようなのですが 一覧が出来ているのに なぜ削除が出来ないのか 初心者で恐縮ですが ご教示頂ければ幸いです。

  • ビュー定義に集約関数を入れる方法を教えてください

    mysql5.0.27です。 ビューを定義するところで、集約関数(例えば、count())の結果をビューの属性のひとつにするには、どのように書けばよいのか、教えてください。 例えば、table_Aとtable_Bから、hoge_viewというビューを作る場合。hoge_viewには属性が2つあって、1つはtable_Aのitemという属性をそのまま定義し、もう1つはtable_Bのdataという属性(数字とします)を全レコードにわたって足し合わせたものとしたい時、どのように書けばいいのでしょうか。 下のようなものを試してみたんですが、当然ですが、動きません。 CREATE OR REPLACE VIEW hoge_view ( item, sum_data ) AS SELECT table_A.item, (count(table_B.data)) <---- ここがよくわかりません! FROM table_A, table_B;

  • 集約関数のDUPLICATEKEY UPDATE

    テーブルmoney、テーブルmoney2にある金額の合計をテーブルmoney3に1日に1回、EVENTでインサートします。money、money2の金額は随時変わるため、最終結果をmoney3に毎日更新していきます。 CREATE table money(g_usr_id INT,g_money INT); CREATE table money2(n_usr_id INT,n_money INT); CREATE table money_all(o_usr_id INT PRIMARY KEY NOT NULL,g_money_all INT,n_money_all INT); 構文 DELIMITER // CREATE EVENT money ON SCHEDULE EVERY 1 DAY STARTS '2012-09-05 00:30:00' ENDS '2013-03-31 00:30:00' DO BEGIN INSERT INTO money_all(o_usr_id,g_money_all,n_money_all) SELECT o_usr_id,SUM(g_money),SUM(n_money) FROM (SELECT g_usr_id AS o_usr_id,g_money,0 AS n_money FROM money UNION ALL SELECT n_usr_id,0,n_money FROM money2) AS T GROUP BY o_usr_id; END; // DELIMITER ; これで初日目の分は無事インサート出来たのですが、翌日以降EVENTがアップデートしようとするとDUPLICATE KEYエラーが出て更新できていません。(当たり前ですが) そこで下記のようにON DUPLICATE KEY UPDATE を付けてみたのですが、エラーになってしまいました。 質問です。 集約関数のON DUPLICATE KEY UPDATE以降はどのように書けばいいか、下記の構文を修正いただけませんでしょうか DELIMITER // CREATE EVENT money ON SCHEDULE EVERY 1 DAY STARTS '2012-09-05 00:30:00' ENDS '2013-03-31 23:30:00' DO BEGIN INSERT INTO money_all(o_usr_id,g_money_all,n_money_all) SELECT o_usr_id,SUM(g_money),SUM(n_money) FROM (SELECT g_usr_id AS o_usr_id,g_money,0 AS n_money FROM money UNION ALL SELECT n_usr_id,0,n_money FROM money2) AS T GROUP BY o_usr_id ON DUPLICATE KEY UPDATE g_money_all=NEW.SUM(g_money),n_money_all=NEW.SUM(n_money) FROM (SELECT g_usr_id AS o_usr_id,g_money,0 AS n_money FROM money UNION ALL SELECT n_usr_id,0,n_money FROM money2) AS T GROUP BY o_usr_id; END; // DELIMITER ; よろしくお願いいたします。(MySQL 5.1です)

    • ベストアンサー
    • MySQL
  • PostgreSQLでの複数結果のまとめ方

    下記の様テーブルよりproduct_idごとに【結果】の様な形として 出力したいと考えております。 【TableA】 order_id|product_id|product_name | quantity 001  product001  商品名1  2 002  product001  商品名1  1 002  product002  商品名2  2 003  product002  商品名2  1 003  product003  商品名3  1 【結果】 product_id|product_name|quantity|order_id product001  商品名1    3     001, 002 product002  商品名2    3     002, 003 product003  商品名3    1     003 SELECT product_id, max(product_name), sum(quantity), order_id FROM TableA GROUP BY product_id, order_id としてみたのですが、 product_id|product_name|quantity|order_id product001  商品名1    3     001 product001  商品名1    1     002 product002  商品名2    2     002 product002  商品名2    1     003 product003  商品名3    1     003 となってしまい、order_idを上記の様にセルにまとめて表示する方法をお教え頂けますと幸いです。 MySQLではGROUP_CONCAT関数を使う事で実現出来たのですが PostgreSQLでの実現方法が分かりかねています。 尚、PostgreSQLのバージョンはPostgreSQL 8.1.23です。 どなたかご教示頂けますと幸いです。

  • Postgreの日付関数に関して教えてください。

    Postgreの日付関数に関して教えてください。 表9.30 日付/時刻関数の例を実行していますが、 make_ で始まる関数がすべて失敗します。 PostgreSQL 9.6.2文書 9.9. 日付/時刻関数と演算子 https://www.postgresql.jp/document/9.6/html/functions-datetime.html 表9.30 日付/時刻関数 select age(timestamp '2001-04-10', timestamp '1957-06-13') select age(timestamp '1957-06-13')  : : select make_date(2013, 7, 15) select make_interval(days => 10) select make_time(8, 15, 23.5) select make_timestamp(2013, 7, 15, 8, 15, 23.5) select make_timestamptz(2013, 7, 15, 8, 15, 23.5) make_dateの失敗のメッセージ ERROR: function make_date(integer, integer, integer) does not exist LINE 1: select make_date(2013, 7, 15) ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. ********** エラー ********** ERROR: function make_date(integer, integer, integer) does not exist SQLステート:42883 ヒント:No function matches the given name and argument types. You might need to add explicit type casts. 文字:8 何が悪いのでしょうか。