PostgreSQLでの構文求む

このQ&Aのポイント
  • PostgreSQLでの構文について教えてください
  • データから指定した範囲の結果を取得したいです
  • SQLの勉強ついでに教えてください
回答を見る
  • ベストアンサー

PostgreSQLでの構文求む

date | ui | total | ------------+-----+-------+ 2005-11-01 | 101 | 3 | 2005-11-01 | 102 | 5 | 2005-11-02 | 101 | 7 | 2005-11-02 | 102 | 6 | というデータから(2005-11-02)-(2005-11-01)のtotal結果がほしいです。 実行結果は、 [0] ui=101,total=4 [1] ui=102,total=1 といった感じの差がほしいです。 現在のクラスの構造上、1文でこの結果を出したいのです。できなかったら諦めますけど…。 SQLは覚えてまだ間もないので勉強ついでに教えてほしいのです。よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • erupi1973
  • ベストアンサー率75% (27/36)
回答No.2

またしても間違っていたらごめんなさい。 動かしてみてはいないもので。 select a.ui as ui, b.total-coalesce(a.total,0) as total from ( select ui, total from date_ui_total where date = '2005-11-02' ) b left join ( select ui, total from date_ui_total where date = '2005-11-01' ) a on a.ui = b.ui で、行けますでしょうか?

koooosuke
質問者

お礼

本当にありがとうございます。 このソースのselect a.ui as uiを select b.ui as uiに変更したら、 途中追加のuiも表示されて、できました! 同時に勉強にもなりました。 SQLのカテゴリもあるのを今発見したので、 次回からはそちらのほうへ投稿します^^;

その他の回答 (1)

  • erupi1973
  • ベストアンサー率75% (27/36)
回答No.1

間違ってたらごめんなさい。 性能面とかまでちゃんと考慮していないのですが.... select a.ui as ui, b.total-a.total as total from ( select ui, total from date_ui_total where date = '2005-11-01' ) a, ( select ui, total from date_ui_total where date = '2005-11-02' ) b where a.ui = b.ui くらいでうまくいかないでしょうか?

koooosuke
質問者

補足

ありがとうございます。 ほしいデータを取得できました。 同時に理解も深まってきました。 補足をつけてもう一つお願いしたいのですが、 このデータは日を増すごとに新しいuiが増えることがあるのです。 上記の式の場合、「where a.ui = b.ui」ですので昔に存在するものは表示しますが、 b.uiは存在して、a.uiには存在しないデータの取得も出来ますでしょうか? WHERE a.ui = b.ui OR b.ui NOT IN (a.ui) これでテストしてみたところORの右側に全部引っかかります。 WHERE a.ui = b.ui OR b.ui NOT IN (SELECT * FROM hist_cntv_t WHERE date = '2005-11-01') これでやると11-01と11-02のデータが表示されてしまいます。 INをうまく使えるといい感じに取得できると思うのですが…やはりPHPやCとは違うので考え方も難しいです(@@

関連するQ&A

  • PostgreSQLでPHPからアップデートができない

    PHPからデータをアップデートしようと思ってアップデートを実行するとうまくいきません。エラーも出ずにうまくいっているように思えるのですが、実際データは更新されていません。 で、その際に生成したSQL文を表示するようにしておいてその文をそのままPSQLから入力すると正常に更新されます。 こういう時は何が考えられるのでしょうか?

    • ベストアンサー
    • PHP
  • PHPにタイムアップによるエラーはありますか?

    PHPのmysql_query関数にてMySQLに要請すると、例えば200件では結果が返ってくるのに、 5000件ではエラーになります。大したデータ量ではないと思いますが、 タイムアップなどでエラーになる事はありますでしょうか? SQL文 ------------------------------------------------------------- SELECT chart_total, chart_card, chart_date, Sum(chart_total) AS sum_total, Sum(chart_card) AS sum_card FROM chart_table WHERE extract(year from chart_date) = 2007 GROUP BY extract(year_month from chart_date) ORDER BY chart_date ------------------------------------------------------------- Linux 2.6.9-42.ELsmp PHP 4.4.4 MySQL 4.0.27

    • ベストアンサー
    • PHP
  • postgreSQLで分からないことがあります。

    postgreSQLで分からないことがあります。 よろしくお願いします。 下にあるtblというテーブルがあったとき。 下のSQLを実行するとデータがうまく取れているんですが、 CURRENT_DATEは日付型でSUBSTRでとりだした日付は文字列 なのに何故正しく比較できているのでしょうか? 日付型の形式の文字列であれば、RDBMSがかってに日付型にしてくれるのでしょうか? tblテーブル *sdateとedateはtimestamp型です。 sdate      | edate | ----------------------------------------- 2010-5-1 10:00:00 | 2010-5-2 13:00:00| SELECT * FROM tbl WHERE CURRENT_DATE BETWEEN SUBSTR(sdate, 1, 10) AND SUBSTR(edate, 1, 10)

  • PL/SQLの戻り値について

    現在正規化されていないテーブルを、PL/SQLを使って集計したいと考えています。以下のような構造にしたいと思うのですが、可能でしょうか? 1.正規化されていないテーブルのデータを正規化されたテーブル(テンポラリーテーブル)へ転記 2.テンポラリーテーブルテーブルのデータを集計(GROUP BYなどで) 3.2の結果を戻す 上記1~3までをすべてPL/SQLで実行し、その結果を取得したいです。 なお取得する結果としては、  キー,集計値1,集計値2    ・    ・    ・ というような構造で、複数レコードあります。 つまり、通常のSELECT文で返ってくる値を、PL/SQLで戻したいと考えています。

  • SQL文のAS句の意味を教えて下さい。

    generate_seriesをネットで調べていたら下記のページを見つけ、このページのSQL文を解読していたら一か所、わからないところがあったので質問しました。 下記のSQL文はサイトからコピーしたものです。 SELECT  current_date + s.a AS date FROM  generate_series(   (SELECT 0 - extract(dow FROM current_date))::int,   (SELECT 6 - extract(dow FROM current_date))::int  ) AS s(a); 下記が上記のSQL文を実行した結果です。   date ---------- 2012-02-26 2012-02-27 2012-02-28 2012-02-29 2012-03-01 2012-03-02 2012-03-03 上記のSQL文のAS句を下記のように私が変更してSQL文を実行したら上記の結果と同じ結果を出力しました。 SELECT  current_date + s AS date FROM  generate_series(   (SELECT 0 - extract(dow FROM current_date))::int,   (SELECT 6 - extract(dow FROM current_date))::int  ) AS s; 下記が上記のSQL文を実行した結果です。   date ---------- 2012-02-26 2012-02-27 2012-02-28 2012-02-29 2012-03-01 2012-03-02 2012-03-03 上記のSQLのAS句の「s(a)」はどういう意味ですか? ※AS句は別名を付ける際に使うと思うんですが... すみませんが説明していただけませんでしょうか? 宜しくお願いします。

  • PHPでMySQL内のデータの合計値を算出

    お世話になっております。 PHPからMySQL5を呼出すスクリプトを制作しています。 no id   date   price ---------------------------- 1  4  2013-4-29  2100 2  2  2013-5-1   3150 3  2  2013-5-31  4200 4  7  2013-6-1   2100 5  2  2013-6-2   1575 6  4  2013-6-2   8400 というようなデータがありますが、下記のように、2番のid、かつ現在から1ヵ月前の期間内のpriceの合計額を算出したいのですが、 SQLおよび変数はどのようなものになりますでしょうか? id: 2  total: 5775 ネットで調べながらSQL文などを色々と試していますが、PHPの変数をどのようにしていしたらいいのかが分からず、結果を返すことが出来ずに立ち止まっている状況です。 大変お恥ずかしい質問と認識しているところですが、アドバイスのほど頂戴出来れば幸いです。 宜しくお願い申し上げます。

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

    昨日こちらで自分の間違ったSQL文をご指摘頂き 時間計算の処理は実装する事が出来たのですが その後の計算処理が終わった後、計算結果をDBに格納する処理で 再度躓いてしまったので、再度のご教授お願いします。 $sql = "SELECT SUM(ROUND(労働時間/100, 0)) + ROUND(SUM(MOD(労働時間,100)) / 60, 2) AS total     FROM 労働時間テーブル WHERE id = 'ログインしている人のID';"; $total_Time = pg_query($con, $sql); $total_Time = pg_fetch_result($total_Time, 0, 'total'); // 確認のため、表示 echo $total_Time; で値はきちんと表示されおります。 しかし、この後UPDATE文で $sql = "UPDATE 労働時間テーブル SET 総労働時間 = '$total_Time' WHERE id = 'ログインしている人のID';"; pg_query($con, $sql); と打ち試しましたが、echoの時に表示された値がDBに格納されません。(>_<) 試しに $sql = "UPDATE 労働時間テーブル SET 総労働時間 = '$total_Time' WHERE id = 'ログインしている人のID';"; の'$total_Time'をSELECT文に変更したりもしましたが、echoの時に 表示されていた値とは違う値がDBに格納されるようになってしまいました。 どのように解決したらよいか、悩んでおります。 そもそもの考え方から間違っているのでしょうか? ご教授の程、よろしくお願い致します。

  • ODBC SQL ServerでSQLを発行したいのですが・・・

    ODBC SQL ServerでSQLを発行したいのですが・・・ IDがそのまま表示されてしまっていたので、再度登録しなおしました>< ・実行SQL DECLARE @DATE DATETIME DECLARE @STARTDATE DATETIME SET @DATE = GETDATE() SET @STARTDATE = DATEADD(DAY,-7,@DATE) SELECT * FROM teble WHERE 配達開始日 >= @DATE AND 配達開始日 <= @STARTDATE 上記のようなSQLを発行しデータを取得したいのですが、実行結果に表示がされません。 どうしていいかわからず困っています。 頭のDECLARE文しか動いていないのではないんだろうかと思っています。 実行ツールはCommon SQL Envieron mentを使用しています。

  • select文で年月日時秒を取得する方法を教えて下さい(初心者)

    startTime(列名) 2007-03-01 17:30:20.140(データ) 2007-03-01 17:30:20.130(データ) 2007-03-01 17:30:20.110(データ) 上記の内容に対してselect文を実行して .140 .130 .110を無視した結果を表示するSQL文を教えて下さい。 年月日時秒は「2007-03-01 17:30:20」を指定。 宜しくお願いします。 実行結果例 2007-03-01 17:30:20 2007-03-01 17:30:20 2007-03-01 17:30:20

  • 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 文法エラーのようなのですが 一覧が出来ているのに なぜ削除が出来ないのか 初心者で恐縮ですが ご教示頂ければ幸いです。