• ベストアンサー

カラムの関係が多対多の場合の集計方法

ページ名 | ユーザID mypage | 2 other | 2 other | 4 mypage | 2 index | -1 index | -1 mypage | 2 other | 3 other | 2 mypage | 2 index | -1 index | 3 上記のテーブルのように、ページ名とユーザIDが多対多のような関係になっている時に、 各ページにアクセスしてきたユニークユーザ数を取得したいと考えております。 上記の例ですと、求めたい答えは下記となります。 mypage:1 アクセスしたユーザは、2だけなので、ユニーク数は1 index:2 アクセスしたユーザは、-1と3なので、ユニーク数は2 other:3 アクセスしたユーザは、2と3と4なので、ユニーク数は3 group byで分けて集計すれば良いと単純に考えたのですが、 selectの対象は、group by の対象で無ければならないみたく、 どのように集計すれば良いのか、とても困っております。 大変申し訳ありませんが、ご教授願えませんでしょうか? 宜しくお願い申し上げます。

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

  • ベストアンサー
  • yamada404
  • ベストアンサー率56% (9/16)
回答No.1

そちらの環境のPostgresのバージョンが分からないですが、 手元の環境ではこんな感じで取れます。 select count(t1.ページ名) , t1.ページ名 from (select ページ名 , ユーザID from テーブル group by ページ名 , ユーザID)as t1 group by t1.ページ名

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

その他の回答 (1)

  • qbr2
  • ベストアンサー率50% (62/123)
回答No.2

いま、手元にポスグレがないから確認できないんだけど、 たしか、このSQLが通ったはず。 SELECT ページ名,COUNT(DISTINCT ユーザーID) FROM テーブル GROUP BY ページ名

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

関連するQ&A

  • 重複データを省いて集計する方法について

    お世話になります。 現在、重複データを省いて集計する方法を考えているのですが、実現できておりません。 実現できるSQLをご存知の方、いらっしゃいましたら情報を頂けますでしょうか。 # 私の使用しているのは、PostgreSQL8.3となります。 実現したい内容は、以下となります。  ・テーブルAからID単位で人数を集計。 ※但しファイル名が同じ場合は、1つとして集計する。   group by句でID,ファイルをグループ化してみたのですが、うまくいきません。    【テーブルA】    ID  ファイル  人数    0001 aaa.txt  3    0001 aaa.txt  3    0001 aaa.txt  3    0001 bbb.txt  3    0001 bbb.txt  3    0001 bbb.txt  3    0000 ccc.txt  3    0000 ccc.txt  3    0000 ccc.txt  3 欲しい結果は、以下となります。     ID  集計    0000 3    0001 6 お手数お掛け致しますが、ご教示のほどよろしくお願い致します。

  • 日付毎の集計方法

    下記のようなテーブル構成で、過去一週間の毎日について、登録した人の数を知りたいです。 ■テーブル名 my_table システムに登録すると,IDが付与され,登録した日付が記録されます。 ---------------------------------------- id(intger) | reg_date(登録した日付,timestamp) ---------------------------------------- 以下のようなSQLを考えたのですが、timestampが「2005-12-01 00:00:00+09」という細かい日付になっているので、これでは「1日」毎の集計にはなりません。 この場合、どう表現すればよいでしょうか? SELECT sum(reg_date) from my_table where ('now' - reg_date < '7days') GROUP BY reg_date order by reg_date

  • 1対多結合で多を絞り込み条件とするSQLについて

    1対多で結合する場合に、多が絞り込み条件となった場合のSQLについての質問です。 たとえばカスタムテーブルを使ったSELECT文などで、このような絞り込み条件が必要になると思います。 まずカスタムテーブルの具体例として、たとえばユーザーテーブルがあったとします。 [user_table] id=INT //オートインクリメント user_id=VARCHAR //adminなどのユーザーID文字列 user_pass=VARCHAR //パスワードを保存※ハッシュ化した値 user_name=VARCHAR //山田太郎などのユーザー名 user_mail=VARCHAR //ユーザーのメールアドレス user_description=TEXT //ユーザーの自己紹介文 user_created=DATETIME //ユーザーの登録日 とりあえず、上記のようなデータをユーザーの基本データだとします。 このユーザーテーブルから、たとえば名前を元に検索するのは単純です。 たとえばこのような感じでしょうか。 SELECT * FROM user_table WHERE user_name = '山田太郎' このテーブル構造を変更することなくカスタムデータを追加したい(しかも柔軟に)という要望を実現するために、ユーザーカスタムテーブルを作ったとします。 [user_custom_table] id=INT //オートインクリメント relational_id=INT //user_table.idへの参照 custom_name=VARCHAR //カスタムフィールド名 custom_value=VARCHAR //カスタムフィールドの値 custom_name、custom_valueには、たとえばそれぞれ以下のような値が入るとします。 custom_name、custom_value Birthday 、1998/1/1 CompanyName 、○○株式会社 CompanyTel、000-0000-0000 CompanyAddress、東京都千代田区○○-○○ user_custom_table.relational_idはuser_table.idにリレーションしているとすると、INNER JOINして値を取得する方法は判ります。 ※カスタムテーブルに値がない場合という状況は無視できる仕様です。 たとえば、会社住所が東京都で始まるユーザのみを抽出すると、以下のような感じでしょうか。 SELECT user_table.* FROM user_table INNER JOIN user_custom_table ON user_table.id = user_custom_table.relational_id WHERE user_custom_table.custom_name = 'CompanyAddress' AND user_custom_table.custom_value LIKE '東京都%' ただ、この方法だと、誕生日が○月○日以前で、会社名に○○を含んで、会社住所が東京都で始まり…と検索条件が増えていった場合にINNER JOINがどんどん増えていって、いかにも効率が悪いと思えてなりません。 とりあえず適当に書いてみるとして、以下のような感じでしょうか。 SELECT user_table.* FROM user_table INNER JOIN user_custom_table AS custom_1 ON user_table.id = custom_1.relational_id INNER JOIN user_custom_table AS custom_2 ON user_table.id = custom_2.relational_id INNER JOIN user_custom_table AS custom_3 ON user_table.id = custom_3.relational_id WHERE custom_1.custom_name = 'CompanyAddress' AND custom_1.custom_value LIKE '東京都%' AND custom_2.custom_name = 'Birthday' AND custom_2.custom_value < '2001/1/1' AND custom_3.custom_name = 'CompanyName' AND custom_3.custom_value LIKE '%○○%' もっと効率の良い書き方、一般的にはこういう場面ではこんな書き方をするなど、識者の方から教えを請いたくて質問しました。 ※ちなみにDBはMySQLですが、とくにMySQLに限らない方法で答えを頂ける方がありがたいです。

    • ベストアンサー
    • MySQL
  • access 1対1と1対多のテーブルをクエリで集計したい…

    受注管理のデータベースを作っています。 売り上げを計算するクエリを作ったのですがどうもうまくいかないので質問します。 集計したいテーブルですが 受注マスタテーブル 注文番号(主キー テキスト型) 注文日(日付型) 氏名 : : 受注明細マスタテーブル 注文番号 (重複あり)受注マスタの注文番号と1対多のリレーションシップ 商品名 品番 販売単価 購入個数 経費・返品金額テーブル 注文番号(主キー)受注マスタの注文番号と1対1のリレーションシップ 経費 返品金額 これを、販売単価×購入個数-経費+返品金額というようにして1ヵ月ごとに集計しようとして、下のようなクエリを作ったのですが経費が何回も計算されてうまくいきませんでした… よろしくお願いします。 SELECT Format(注文者マスタ!注文日,"yyyy/mm") AS 月, Sum([受注明細マスタ]![販売単価]*[受注明細マスタ]![購入数量]-[経費・返品金額テーブル]![経費]+[経費・返品金額テーブル]![返品金額]) AS 売上 FROM (注文者マスタ RIGHT JOIN 経費・返品金額テーブル ON 注文者マスタ.注文番号 = 経費・返品金額テーブル.注文番号) LEFT JOIN 受注明細マスタ ON 注文者マスタ.注文番号 = 受注明細マスタ.注文番号 GROUP BY Format(注文者マスタ!注文日,"yyyy/mm");

  • 1000件以下の場合はカラム数に関係なくキー不要?

    全てのカラムを対象にソートや絞り込みをする、また、テーブルを分割する必要がない場合、 全てのカラムにインデックスをつけるしかないと考えていましたが、 http://www28.atwiki.jp/lucier/pages/55.html 「MySQLでは1000件以下のデータの場合はインデックスを作成しないほうが 速い」 1000フィールドならカラムの数に関係なくインデックス不要で カラムの数が10の場合と、 カラムの数が50の場合 それぞれ負荷はかわらないということでしょうか。

    • ベストアンサー
    • MySQL
  • アクセス クエリ・集計・計算方法について

    アクセスの集計機能を使用して、品名毎の数量の合計と金額の合計を算出しようとしていますが、 思うようにできません。どなたか教えてください。 クエリのフィールドを左から・・・ (1)年月: Format([日付],"yyyy/mm")(集計:グループ化) (2)品名(集計:グループ化) (3)品名のカウント(集計機能:カウント) (4)単価(集計:グループ化) (5)金額: [単価]*[品名のカウント](集計:グループ化) このような形でクエリを実行していますが、すべての注文が1つだけなら問題ないのですが、実際には品名には数量が掛けられている場合もあり、現在設定しているクエリ設定では正しい数量の合計と金額の合計を出すことができません。どうか集計方法をご教授いただけないでしょうか。よろしくお願いします。 ■現在のテーブルの設計とリレーションを明記します。 【A】顧客テーブル (1)顧客ID (2)発注コード (3)氏名 【B】商品テーブル (1)商品ID (2)品名 (3)単価 【C】注文テーブル (1)注文ID (2)日付 (3)顧客ID 【D】注文明細テーブル (1)注文明細ID (2)注文ID (3)商品ID (4)数量 リレーション 【A】(1)-【C】(3) 【B】(1)-【D】(3) 【C】(1)-【D】(2)

  • ソート方法が分からない

    アクセスログをユーザーエージェント別に集計し、 その際に、あるIPアドレスだけを除いたアクセス数でソートしたいのですが、方法がわかりません。(1レコード1アクセスです) 下記の様に、やってみたのですが、やはり「COUNT(`ip`="210.153.84.1")」の部分が上手く行きません。 SELECT `user_agent`, COUNT(*) FROM `access_log` GROUP BY `user_agent` ORDER BY COUNT(*) - COUNT(`ip`="210.153.84.1"); ご教授よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • アクセス2000を使ってのデータ集計方法

    はじめまして、アクセス2000を使って支払テーブルを作成しました。フィールドは、日付 メーカーID 金額 現場名ID 勘定科目ID・・等です。 メーカと現場名と勘定科目はマスタテーブルを別に作って そこから参照させています。これにデータを打ち込んでいって月別金額集計と メーカ別金額集計と 現場名別金額集計と勘定科目別金額集計をさせたいのですが フォームとレポートに支払テーブルレコードを表示させて 合計金額を表示させるにはどのようにすれば良いでしょうか? 判りにくい説明ですが 4月分のデータを一覧表示させて合計金額を表示次に5月分のデータを一覧表示させて合計金額を表示と言う具合です

  • 上手な集計方法

    現在 事務所の小口を管理してます。 添付したような シートの表がありまして 集計して 小口の現金がすくなくなると 印刷して申請をすると 入金になるシステムになってます。 申請のために一度〆 別シートに同じ表からスタートしてます。 シート名は〆日をつけて どんどん増えてます。 このままでは 勘定科目ごとの集計が とても面倒で 現在シートも増えすぎ計算が遅くなってきてます。 アクセスもためしたんですが うまくできず・・・ なにか 改善案などありましたら 参考にさせていただきたいです。 ※ページを印刷すると ヘッダーなどで 申請書タイトルや検印の図をつけてます。

  • 【Access】レポートのグループ集計結果をページヘッダーへ表示したい

    作業環境 Access2007 WindowsXP よろしくお願いします。 グループ化したデータの集計結果をページヘッダーより上に表示する方法は無いでしょうか。 現在店舗コードでレポートをグループ化し、金額と明細数の合計をグループヘッダーへ表示しています。 しかしこの方法だと、ページヘッダーに指定しているデータ見出しの下に合計が表示される為、見栄えが非常に悪いのです。 例) 商品No 商品名 単価 売上数 合計  ← ページヘッダーの見出し      店舗A 250  明細数 2     ← グループ集計   1    AAA   10   5    50     2    BBB   20   10   200 (改ページ) 商品No 商品名 単価 売上数 合計  ← ページヘッダーの見出し      店舗B 3,800  明細数 3     ← グループ集計   1    CCC   30   20    600     2    DDD   40   30   1200   3    EEE   50   40   2000 上記例のような表示を、以下のように変更したいのです。      店舗A 250  明細数 2     ← グループ集計 商品No 商品名 単価 売上数 合計  ← ページヘッダーの見出し   1    AAA   10   5    50     2    BBB   20   10   200 (改ページ)      店舗B 3,800  明細数 3     ← グループ集計 商品No 商品名 単価 売上数 合計  ← ページヘッダーの見出し   1    CCC   30   20    600     2    DDD   40   30   1200   3    EEE   50   40   2000 グループフッターへ合計を表示させれば問題無いのですが、 集計は必ずヘッダーへ表示させるよう指示を受けている為、 何か方法がありましたらご教授頂きたいと思います。 分かりにくい説明で申し訳ありませんが、よろしくお願い致します。

このQ&Aのポイント
  • C言語のファイルの入出力について説明します。
  • 現在、下記の課題に取り組んでいるのですが、qsortの所で詰まってしまいました。どなたか修正点を教えて頂けないでしょうか?
  • 電卓アプリケーションの作成について説明します。四則演算ができるアプリケーションで、計算結果をログファイルに保存し、昇順または降順でログを表示する機能もあります。
回答を見る