• 締切済み

【SQL 2つのコードが重複する場合、除外して集計する】

色々試行錯誤していますが、データの出力が正しくできません。 本日、別の質問を記載したのですが、上手く質問がまとまっていなかったために再度投稿したします。 統括会社(テーブルA)ごとにお店の評価を出力したいと思っています。 ただ、上手くできなくて困っています。 ======================== 行いたいこと ======================== テーブルは3つあります。 テーブルAは統括会社のテーブル、Bは店情報、Cはお店の評価結果です。 行いたいのは、統括会社のグループコードごとに、統括会社傘下のお店の評価結果の合計を表示することです。 その際、期間(登録日)を指定して合計値を表示するといったことを行いたいです。 ただ、評価結果の合計を算出する際に、お店(店名コード)ごとに過去の評価結果に”○”がついた項目CDは、重複しない形で計算をしたいです。 例) 項目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 店名コード,項目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 何卒よろしくお願いいたします。

みんなの回答

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

質問内容に少し不備がありそうな気がしますが、 要点と提示されてるSQLだけを見て判断すると、 select テーブルA.グループコード,count(rtable.評価結果) from (select 店名コード,項目CD,評価結果,MAX(登録日) from テーブルC where 登録日 between '2000-01-01' and '2009-01-01' and 評価結果 = '○' group by 店名コード,項目CD,評価結果)as rtable,テーブルA,テーブルB where テーブルA.グループコード = テーブルB.グループコード and テーブルB.店名コード = rtable.店名コード and テーブルA.グループコード ='AAAA' group by テーブルA.グループコード で良いのではないかと。 rtableのgroup byの条件に登録日が含まれていたために、 登録日が異なると、別レコードとしてカウントしてきていたのが、 想定と、実際の結果が異なっていた理由ではないでしょうか。

回答No.1

提示されたデータで、どれが集計対象か示せませんか? 例えば、次のような感じで。 項目CD  評価結果 店名コード   登録日 ------------------------------------- 1 1-1-1   ○     ららら   2000-10-10←集計対象 2 1-1-1   ○     ららら   2007-12-10←#1と同一なので集計対象外 >お店(店名コード)ごとに過去の評価結果に”○”がついた項目CDは、重複しない形で計算をしたい 同じ店で、あるときは○、あるときは×といった評価をされることはあり得ないのでしょうか?

関連するQ&A

  • 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    どうしても出来なくって、困っています。 よろしくお願いいたします!!

  • SQL文 合計値を出力する

    ID  項目CD  評価結果 ------------------------- A   1-1-1   ○ A   1-1-1   ○ B   1-1-1   × C   1-1-1   ○ A   1-2-1   ○ A   1-2-1   ○  B   1-2-1   ○ C   1-2-1   〇 上記のテーブルがあります 評価結果は、○と×があり、項目CDごとに集計を行い、項目CDが同じ場合は、○がいつくあっても1とみなして計算するということをおこないたいです 理想SELECT結果 ID  合計  -------------- A   2   (1-1-1で○が2つあるが、1つとして計算) B   1    C   2     SELECT ID,SUM(評価結果) FROM TABLE GROUP BY ID でIDと合計までは出せました 現在のSELECT結果 ID  合計  -------------- A   4   (すべての○の合計を出力) B   1    C   2   項目CDが同じ場合"○"を1つとして集計するにはどうすればいいのでしょか?

  • SQLでの集計について

    こんにちわ。以下のようなテーブルから条件に見合う合計を出したいと思いSQLを書いてみたのですが、 思った結果になりません。 テーブルA ID1 得意先Cd 営業所Cd 日付 1  001    001  2005/09/01 2  001    002  2005/09/01 3  001    001  2005/09/03 テーブルB ID2 ID1 部署 数量 金額 1  1  01  1  1000 2  1  01  1  1000 3  1  02  1  1000 4  2  01  1  1000 5  2  01  1  1000 6  3  01  1  1000 7  3  01  1  1000 8  3  02  1  1000 [抽出結果] 得意先Cd 営業所Cd 日付  部署 数量(Sum) 金額(Sum) 001    001  2005/09/01 01   2   2000 001    001  2005/09/01 02   1   1000 001    001  2005/09/03 01   2   2000 001    001  2005/09/03 02   1   1000 001    002  2005/09/01 01   2   2000 [SQL] select 得意先Cd,営業所Cd,日付,部署,SUM(数量) As '数量計',SUM(金額) As '金額計' from テーブルA AA Inner join テーブルB BB ON (AA.ID1 = BB.ID1) group by 得意先Cd,営業所Cd,日付,部署,数量,金額 order by 得意先Cd,営業所Cd,日付,部署 このSQLを実行すると、日付、部署共に同じ場合でも数量・金額が合計値となりません。 得意先Cd 営業所Cd 日付  部署 数量 金額 001    001  2005/09/01 01 1  1000 001    001  2005/09/01 01 1  1000 どのように変更を加えれば、上記の「抽出結果」にできるのでしょうか? よろしくお願いいたします。

  • SQLが組めません…

    大変恥ずかしい話ですが恥をしのんでHelpさせていただきます。 例えばテーブルTESTに項目がCODE,NAMEとあったとして NAMEの内容がかぶっている項目が有ったら 大きいCODEの方を小さいCODEの内容に上書きするSQLを組みたいのです ex) CODE NAME --------- 0001 AAAA 0002 AAAA 0003 BBBB 0004 CCCC 0005 CCCC を以下のような実行結果にしたい ex) CODE NAME --------- 0002 AAAA 0002 AAAA 0003 BBBB 0005 CCCC 0005 CCCC どなたかお応えください お願いします。。。 使用しているのはORACLE9iです。

  • SQLの集計について教えてください。

    環境はoracle9iです。 ■テーブルの構成 |年度|月|部署コード|商品コード|金額| ■テーブルの内容 |2010|01|AAA|001|1000| |2010|02|AAA|001|2000| |2010|01|AAA|001|3000| |2010|01|AAA|002|3000| |2010|02|BBB|003|4000| |2010|01|CCC|001|5000| |2010|03|CCC|001|6000| 上記のようなテーブルがあり、 これを年度,月,部署コード,商品コードでサマリした値を表示したいです。 と、ここまでなら上の4つでGROUP BYしてあげれば良いのですが、 そこに年度,部署コード,商品コードでサマリした 「累計金額」列を加える必要があります。(イメージは下記のとおりです。) ■抽出結果の構成 |年度|月|部署コード|商品コード|金額|累計金額| ■抽出結果の内容 |2010|01|AAA|001|4000|6000| |2010|02|AAA|001|2000|6000| |2010|02|BBB|003|4000|4000| |2010|01|CCC|001|5000|11000| |2010|03|CCC|001|6000|11000| GROUP BYと別の集計単位で列を作ることが可能か、 可能であればどのようなSQLを書くべきか、 というところを教えてください。

  • レコード集計のSQLについて

    お世話になります。 SQL Serverに関する質問です。 以下の内容を満たすSQLを作成したいのですが、 方法がわからず困っています。 (内容) *************************************************************** ・Aテーブル、Bテーブルには、以下のレコードが格納されています。 [Aテーブル] | key_code | code1 | code2 | code3 | money | person | ← カラム名 ---------------------------------------------- | 001 | 1 | 1 | 1 | 1000 | 10 | ---------------------------------------------- | 001 | 1 | 2 | 1 | 3000 | 10 | ---------------------------------------------- | 001 | 1 | 1 | 1 | 1000 | 10 | ---------------------------------------------- [Bテーブル] | key_code | cd1 | cd2 | cd3 | cd4 | cd5 | ・・・・・ | cd10 | ← カラム名 ------------------------------------------------------------ | 001 | 01 | 02 | 10 | 30 | 51 | ・・・・・ | 90 | ------------------------------------------------------------ | 002 | 01 | 02 | 03 | 10 | 40 | ・・・・・ | 55 | ------------------------------------------------------------ ・Aテーブルの key_code とBテーブルの key_code を関連付けて、  Bテーブルのcd1~cd10に格納されている各コード単位に集計した  Aテーブルのmoney及びpersonの値を取得したい。  例えば、 key_code = '000' でAテーブルとBテーブルを関連付けして、 Bテーブルのcd(1~10) = '10' で集計した Aテーブルの money と personの 値を求めたい。 **************************************************************** 初歩的な質問で申し訳ございませんが、 どなたかご教授願えませんでしょうか? よろしくお願いいたします。

  • SQL文 合計と、特定の値を取り出す

    テーブル名:料金表 ID  項目CD  金額 ------------------------- 1   101   1000 1   102   2000  1   103    100 2   101   1000 2   102   2000 2   103    50 3   101   1000 3   102   2000 上記のテーブルがあります IDと、金額の合計と、項目CDが103のものだけ金額をだしたいのです 理想SELECT結果 ID  合計  項目CD:103 ------------------------- 1   3100   100 2   3050    50 3   3000    0(もしくはnull)  select ID,sum(金額) as 合計 from 料金表 where ID in(1,2,3) group by ID,金額 でIDと合計までは出せました 特定の項目の値を取り出すのはどうしたらいいでしょうか?

  • 重複データの集計方法を教えてください。

    テーブル名:テスト コード SEQ 0001  1 0001  2 0001  3 0002  1 0002  2 0002  3 0003  1 0003  2 0003  3 0003  4 0003  5 0003  6 0003  7 0003  8 0004  1 0004  2 0005  1 0005  2 0005  3 0005  4 0005  5 0005  6 0005  7 0005  8 0006  1 0006  2 0007  1 0007  2 こういったデータのテーブルがあります。 そこで、「コード」の重複件数が6件以下の データを集計したいのです。 これで、重複したコードの件数がでると思うのですが、 SELECT COUNT(コード) FROM テスト GROUP BY コード こういうイメージです。 3 3 8 2 8 2 2 6より多いデータは、6にして、それ以外のデータはそのままの値にしたいのです。 CASE WHEN aa > 6 THEN '6' ELSE aa END 上で書いたSELECTの結果を上記のCASEで使いたいのですが、 どのように記述すればよいのでしょうか? 下記のようにしてもうまくいきませんでした。 SELECT CASE WHEN aa > 6 THEN '6' ELSE aa END FROM (SELECT COUNT(コード) FROM テスト GROUP BY コード) as aa 最終的には、 3 3 6 2 6 2 2 となったものの合計を出したいです。 24がでればいいです。 よろしくお願いします。

  • SQLとデータベースについて?

    すいません質問させてください。 2つのデータベースがあります。 データベース名が -------------- SC CM -------------- の2つです。 そこに複数のテーブルがあります。 そこで質問なのですが、SCのデータベースのテーブル名AAAとCMのデータベースのテーブル名がBBBの 中から列名の店コードが違う物だけ抽出したいです。 ------------------------------- データーベースSC テーブルAAA 店コード、店名、店地域 123,あ,東京 231,い,大阪 312,う,京都 111,え,福岡 ------------------------------ ------------------------------- データーベースCM テーブルBBB 店コード、店地域 123,東京 111,福岡 ------------------------------ 上の様な造りになっています。 抽出結果 ----------------------------- 店コード、店名、店地域 231,い,大阪 312,う,京都 ---------------------------- 私なりの考えなのですが SELECT * FROM AAA,BBB where AAA.店コード <> BBB.店コード このSQL文を改変して出来ると思われますか? SCのデータベースからCMのデータベースを比べることは、出来ますか? よろしくお願いします。

  • 集計をしたい

    SQLで集計をしたいです。 SQLを始めたばかりの者です。 下記、よろしくお願いします。 説明不足がありましたら、ご指摘をお願いします。 MS-SQLServer2005環境です。 下記の売上テーブルが存在します。 テーブル:UriageTBL 年月日 受注番号 商品コード 商品名 個数  単価  金額 20101001 100   300     リンゴ   1   100   100 20101001 110   400     バナナ   1   150   150 20101001 110   400     バナナ  -1   150  -150 20101001 120   500     キャベツ  1   120   120 20101002 130   500     キャベツ  1   120   120 20101002 140   600     レタス   1   110   110 20101002 140   600     レタス   1   110   110 20101002 150   400     バナナ   1   150   150 ----------------------------- 商品コードに対応する商品グループ(テーブルは存在しません) 商品コード 商品グループ 300     果物 400     果物 500     野菜 600     野菜 ---------------------------- 【結果】 年月日 商品グループ 受注件数 個数合計 金額合計 2010/10/01 果物       1     1     100 2010/01/01 野菜       1     1     100 2010/10/02 果物       1     1     150 2010/10/02 野菜       2     3     340 売上テーブル(UriageTBL)を、年月日別、商品グループ別に集計し、受注件数、個数合計、金額合計を取得したいです。 また、商品コードに商品グループテーブルが存在しない為、SQL内で設定します。 ただし、受注合計金額が0円の時は集計から外します。(受注番号110は集計から外します。) (受注件数は、受注番号の件数です。) 上記の場合、どのようなSQLの組み方をすればよいのか見当もつかず悩んでおります。 どなたかご教授頂ける方がいらっしゃいましたら、よろしくお願い致します。