- 締切済み
SQL データ集計
はじめまして、現在Postgres8.3を利用して開発を行っています。 以下のテーブルがあります。 No グループ ------------------------------------- 1 AAAA 2 BBBB 3 CCCC ■テーブルB ID 項目CD 評価結果 グループ 登録日 ------------------------------------- A 1-1-1 ○ AAAA 2000-10-10 A 1-1-1 ○ AAAA 2007-12-10 B 1-1-1 × AAAA 2006-12-16 C 1-1-1 ○ AAAA 2009-04-16 A 1-2-1 ○ AAAA 2004-10-16 A 1-2-1 ○ AAAA 2007-01-16 B 1-2-1 ○ AAAA 2003-12-14 C 1-2-1 〇 AAAA 2007-12-15 評価結果は、○と×があり、項目CDごとに集計を行い、項目CDが同じ場合は、○がいつくあっても1とみなして計算するということをおこないたいです。 登録日を指定して、抽出したいのですが、 登録日を 条件に含めると、全部計算されてしまいます。 select count(評価結果) from (select ID,項目CD,評価結果 from テーブルB group by ID,項目CD,評価結果 order by ID,項目CD,評価結果) as rtable where rtable.評価結果 = '○' rtable.登録日 between '2000-01-01' and '2009-01-01' ■理想の結果 グループ 合計 -------------- AAAA 5 ■現在の結果 グループ 合計 -------------- AAAA 7 どうしても出来なくって、困っています。 よろしくお願いいたします!!
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- yone_1117
- ベストアンサー率0% (0/10)
#1です。 あらかじめBの排除すべきデータを排除して、改めてBと繋げるというのはどうでしょ。実行してないんで間違ってるかもしれませんがこんな感じで。 select A.グループコード,Count(B.評価結果) from (select 項目ID,店コード,Max(登録日) from B where 登録日 Between '2000-01-01' and '2009-01-01' group by 項目ID、店コード) as rtable join B on B.項目ID = rtable.項目ID and B.店コード = rtable.店コード and B.登録日 = rtable.登録日 join C on B.店コード = C.店コード join A on C.グループコード = A.グループコード where B.評価結果 = '○' and A.グループコード = 'AAAA'
- nora1962
- ベストアンサー率60% (431/717)
#2です SELECT SUM(CNT) FROM (SELECT COUNT(distinct 評価結果) AS CNT FROM テーブルB WHERE 登録日 between '2000-01-01' and '2009-01-01' AND 評価結果 = '○' GROUP BY ID,項目CD,グループ) AS R でした。
- nora1962
- ベストアンサー率60% (431/717)
SELECT COUNT(distinct 評価結果) FROM テーブルB WHERE 登録日 between '2000-01-01' and '2009-01-01' AND 評価結果 = '○' GROUP BY ID,項目CD,グループ でいいのでは。 ただし、 > C 1-1-1 ○ AAAA 2009-04-16 のデータが登録日の条件に適合しないから結果は「4」になりますが。
- yone_1117
- ベストアンサー率0% (0/10)
そのSQL、ほんとに実行結果が出るんですか? rtableのSelectに「登録日」が無い時点で rtable.登録日 between ~ でエラーになると思うんですが。「グループ」もSelectに無いですね。 質問に書いてあるSQLでは理想の結果どころか現在の結果も出ない気がするんですが・・・
補足
申し訳ございません。ご指摘通りでした。 正しくは、以下のSQLです。 select グループ,count(評価結果) from (select ID,項目CD,評価結果、登録日 from テーブルB group by ID,項目CD,評価結果,登録日 order by ID,項目CD,評価結果,登録日) as rtable where rtable.評価結果 = '○' rtable.登録日 between '2000-01-01' and '2009-01-01' 申し訳ございません!! 教えてもらう物の立場として、きちんと正しく説明できなければ、失礼ですね。気をつけます。
補足
すみません。ご指摘いただいたのに、こちらの質問の仕方が悪く、 期待した結果が表示されませんでした。かなり割愛していたため、 再度、質問させてください。 ======================== 行いたいこと ======================== テーブルは3つあります。(すみません正しくは3つです。) テーブルAは統括会社のテーブル、Bは店情報、Cはお店の評価結果です。 行いたいのは、統括会社ごとに、統括会社傘下のお店の評価結果の合計を表示することです。 その際、期間を指定して合計値を表示するといったことを行いたいです。 ただ、評価結果の合計を算出する際に、お店ごとに過去に”○”がついた評価項目は、重複しない 形で計算をしたいです。 例) 項目CD”1-1-1”で店名AAAの評価結果が"○"が2つ、店名BBBが"○"が零(0)、店名CCCが"○"4つの場合 評価結果2として算出 ================= テーブル ================= ■テーブルA →統括会社のテーブルです グループコード グループ名 ------------------------------------- AAAA ああああ BBBB いいいい CCCC うううう ■テーブルC →店情報のテーブルです 店名コード グループコード ------------------------------------- ららら AAAA せせせ BBBB ししし CCCC ■テーブルB →店の評価結果をもつテーブルです 項目CD 評価結果 店名コード 登録日 ------------------------------------- 1-1-1 ○ ららら 2000-10-10 1-1-1 ○ ららら 2007-12-10 1-1-1 × せせせ 2006-12-16 1-1-1 ○ ししし 2009-04-16 1-2-1 ○ ららら 2004-10-16 1-2-1 ○ せせせ 2007-01-16 1-2-1 ○ ししし 2003-12-14 1-2-1 〇 ししし 2007-12-15 ============== SQL ============== SQLは以下の通りです。 select テーブルA.グループコード,count(rtable.評価結果)、 from (select ID,項目CD,評価結果,登録日 from テーブルC group by 店名コード,項目CD,評価結果,登録日 order by 店名コード,項目CD,評価結果,登録日) as rtable,テーブルA,テーブルB where テーブルA.グループコード = テーブルB.グループコード and テーブルB.店名コード = rtable.店名コード rtable.評価結果 = '○' and rtable.登録日 between '2000-01-01' and '2009-01-01' and テーブルA.グループコード ='AAAA' =============== 結果 =============== ■理想の結果 グループ 合計 -------------- AAAA 5 ■現在の結果 グループ 合計 -------------- AAAA 7