はじめまして、現在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   

どうしても出来なくって、困っています。
よろしくお願いいたします!!

A 回答 (4件)

#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'
    • good
    • 0

#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
でした。

この回答への補足

すみません。ご指摘いただいたのに、こちらの質問の仕方が悪く、
期待した結果が表示されませんでした。かなり割愛していたため、
再度、質問させてください。
========================
行いたいこと
========================

テーブルは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

補足日時:2009/05/26 23:08
    • good
    • 0

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」になりますが。
    • good
    • 0

その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'

申し訳ございません!!
教えてもらう物の立場として、きちんと正しく説明できなければ、失礼ですね。気をつけます。

補足日時:2009/05/26 18:23
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング

おすすめ情報