質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

616閲覧

PostgreSQLでクロス集計をしたい

jam912sh

総合スコア25

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/09/24 12:08

編集2018/09/24 12:10

前提・実現したいこと

DBから受信したデータを、日付別、グループ別に集計をして
CSVファイルに格納したいのですが、PHPエラーが発生して上手くいきません。
PHP,PostgreSQLにお詳しい方、ご教授頂きたく存じます。
宜しくお願い致します。

DBデータ

データベース名:m_test2 data1 | item ----------------- 2018-09-01 | item1 2018-09-01 | item1 2018-09-01 | item1 2018-09-01 | item2 2018-09-02 | item1 2018-09-02 | item2 2018-09-02 | item2 2018-09-02 | item3

集計後の理想のCSVファイル

CSVファイル:list.csv days | item1 | item2 | item3 2018-09-01 | 3 | 1 | 0 2018-09-02 | 1 | 2 | 1

該当のソースコード

<?php // PostgreSQLに接続 $conn = pg_connect('host=localhost dbname=test user=XXXX password=XXXX'); $query = "COPY (SELECT * FROM crosstab('SELECT data1, item, count(item) FROM m_test GROUP BY data1, item ORDER BY data1, item' ) AS m_test( days timestamp, item1 bigint, item2 bigint, item3 bigint ) TO '/Applications/MAMP/htdocs/web/csv/list.csv' CSV HEADER"; $result = pg_query($conn, $query); ?>

試したこと

「GROUP BY」と「COUNT()」を使用した
日付ごと、アイテムごとの集計までは成功しておりますが、
「crosstab関数」の辺りが上手くいっていないようです。

補足情報(FW/ツールのバージョンなど)

■補足情報
・DBとの連携動作には問題ございません。
・PHPは以下のエラーが発生しております。

■PHPエラー情報
PHP:5.6.3
PostgreSQL: 10.5
MAMP:5.0.1

PHPエラー内容

※エラーが発生している21行目は、「$result = pg_query($conn, $query);」です

PHP Warning: pg_query(): Query failed: ERROR: syntax error at or near &quot;TO&quot; LINE 12: ) TO '/Applications/MAMP/htdocs/web/csv/list.csv' CSV HEAD... ^ in /Applications/MAMP/htdocs/web/index.php on line 21

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

見当違いだったら申し訳ないのですが下記

sql

1crosstab('SELECT data1, item, count(item) 2 FROM m_test 3 GROUP BY data1, item 4 ORDER BY data1, item' 5 )

最初のシングルクォートが邪魔してませんか?

投稿2018/09/24 12:38

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jam912sh

2018/09/25 01:25

ご確認頂き有難うございます!上記のご指摘の箇所、修正致しました。 現象は解消されませんでしたが、貴重な情報頂き有難うございました!
guest

0

crosstab()内のカラム数とエイリアス内のカラム数が一致していません。

SQL

1SELECT * FROM 2 crosstab('SELECT data1, item, count(item) 3 FROM m_test 4 GROUP BY data1, item 5 ORDER BY data1, item' 6 ) 7 AS m_test( 8 days timestamp, 9 item1 bigint, 10 item2 bigint 11 )

こういった類はまずSQL単独で実行してみて意図通りなのかを確認してから埋め込むようにした方が効率がいいですよ。
後はCOPY の後の括弧が閉じていないようです。

投稿2018/09/24 12:31

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jam912sh

2018/09/25 01:37

ご確認頂き有難うございます。説明が分かりずらく申し訳ございません。 1つのカラム(item)の中を3つに分ける事が目的で御座いまして、 カラム数とエイリアス内のカラム数が一致しない状態で御座います。 (1つのカラムから3つのカラムを作り出すのが目的で御座います。) また、SQL単独での動作は、日付ごと、アイテムごとの集計までは成功致しております。 「集計後の理想のCSVファイル」を目指しておりますが、お力お借り頂けますと幸いで御座います。 初心者の為、説明が分かりずらいかと存じますが、ご了承頂きたく存じます。
sazi

2018/09/25 01:48 編集

SQLが正しいなら、COPY で、SQLを括った()が合っていないように見えます。 COPYもSQLと同様に実行できますので確認できます。 因みに、指定するパスはPostgresが認識できるパスである必要があります。
jam912sh

2018/09/25 01:58

ご返答有難うございます。上記の件、承知致しました。 今一度、SQLを括った()内に問題がないか調査致します。 ご指摘頂き有難うございました。
sazi

2018/09/25 02:03

webサーバーとDBサーバーが別なら、'/Applications/MAMP/htdocs/web/csv/list.csv'はwebサーバー上のパスに見えるので、マウントされていないとpostgresからは認識できないと思われます。
jam912sh

2018/09/25 02:06

再度のご指摘有難う御座います! 念のため、簡単な別コードにて、csvディレクトにlist.csvが生成できる事は確認致しております。
jam912sh

2018/09/25 02:21 編集

sazi様 以下のサイトを参考に作成致しております。 http://blog.fusic.co.jp/archives/954 参考サイトでは性別のカラムから「男性」と「女性」を生成する流れかと存じますが、 私の場合は、カラムから「アイテム1」「アイテム2」「アイテム3」を生成できればよいので御座いますが、中々うまく動作しない現状で御座います。 まだまだ勉強不足で御座います。ご迷惑をお掛け致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問