重複データの集計方法と重複件数

このQ&Aのポイント
  • テーブル名「テスト」のデータに重複した「コード」がある場合、重複件数を集計する方法を教えてください。
  • SELECT COUNT(コード) FROM テスト GROUP BY コードの結果を使って、重複件数が6件以下のデータは6件に、それ以外はそのままにしたい場合、どのように記述すればよいでしょうか?
  • CASE文を使って、重複件数が6件以上のデータを6件に置換し、それ以外のデータはそのまま残す方法を教えてください。最終的には重複件数の合計値を出したいです。
回答を見る
  • ベストアンサー

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

テーブル名:テスト コード 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がでればいいです。 よろしくお願いします。

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

  • ベストアンサー
  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.1

SELECT SUM(Case when Cnt > 6 then 6 ELSE CNT END) as Rcnt FROM (SELECT COUNT(コード) AS CNT FROM テスト GROUP BY コード) INTBL __________________________________________ 上記が回答です。

reokun5785
質問者

お礼

早速ありがとうございます。 とても分かりやすくてよかったです。

関連するQ&A

  • オーダーNo.毎に集計するSQL

    オーダーNo.毎に集計するSQLを考えているのですが、少しSELECT文法で行き詰まってしまったので教えてください。 オーダーNo.毎にグループ化して、コード別の件数を集計します。 そして、コードが「10」のものが1件でもあれば表示する、というようなことを考えています。 SELECT ORDERNO, SUM(CASE WHEN CODE = 0 THEN 1 ELSE 0 END) AS CODE0, SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) AS CODE10, SUM(CASE WHEN CODE > 0 THEN 1 ELSE 0 END) AS CODEALL FROM DBORDER WHERE SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) > 0 GROUP BY ORDERNO ORDER BY ORDERNO このようにすると、WHEREのところで構文エラーになります。 ここをどのように変えれば意図どおりの動きをするようになるのか知りたいです。 よろしくお願いします。

  • ASで指定した項目名をGROUP BYやORDER BYで使用する方法。

    ただいまSQLの勉強をしています。 タイトルどおりなのですが、ASで指定した項目名をGROUP BYやORDER BYで使用する方法はあるのでしょうか? CASE文を使用したこちらのSQL文↓で、SELECT文、GROUP BY句、ORDER BY句の中に重複する部分が多く出てしまうのでどうにかすっきりさせたいと思い、独自に調べたり色々と試したのですがわからず、質問させていただきました。 お分かりになる方、いらっしゃいましたらご助言どうぞよろしくお願いいたします。 <SQL文> SELECT CASE WHEN trancd % 3 = 1 THEN '購入番号(1,4,7,…)の集計' WHEN trancd % 3 = 2 THEN '購入番号(2,5,8,…)の集計' ELSE '購入番号(3,6,9,…)の集計' END AS グループ名称 , sum(suryo) AS 数量合計 FROM tran GROUP BY CASE WHEN trancd % 3 = 1 THEN '購入番号(1,4,7,…)の集計' WHEN trancd % 3 = 2 THEN '購入番号(2,5,8,…)の集計' ELSE '購入番号(3,6,9,…)の集計' END ORDER BY CASE WHEN trancd % 3 = 1 THEN '購入番号(1,4,7,…)の集計' WHEN trancd % 3 = 2 THEN '購入番号(2,5,8,…)の集計' ELSE '購入番号(3,6,9,…)の集計' END;

  • MySQLでWHEN句のサブクエリ中にて

    MySQL ver.5.0.95です。 PHPからSQL文を作ってDBへインサートしているのですが 重複した値が合った場合はupdateするように書いています。 TBL1には |id   |string   |count 1    aaa    0 2    bbb    3 3    ccc    1 TBL2には |id2    |string2    |count2 1      aaa      0 2      bbb      2 3      ccc      1 実際はもう少し複雑ですが、こういう感じでデータが入ってるとします。 このとき、TBL1のそれぞれをインサート若しくはアップデートするのに TBL2の同一IDのものの、count2の状態によって場合分けしたく 同一IDのcount2が1以上なら変更しない、という風にするため以下のように書いたのですが insert into TBL1 values (1, "aaa", 3), (2, "bbb", 3), (3, "ccc", 3), (4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = values(id)) >=1 THEN count ELSE count + values(count) END; #1064 - You have an error in your SQL syntax;というエラーになって出来ません。 WHENの中のサブクエリで、where id2 = values(id) 恐らくこの文がダメなようです。 例えば決め撃ちで1つ1つ書くと通ります。 insert into TBL1 values(1, "aaa", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 1) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(2, "bbb", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 2) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(3, "ccc", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 3) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 4) >=1 THEN count ELSE count + values(count) END; これをエラーになったような文に変えて1文にまとめたいのですが、無理でしょうか? あとそもそもこれをまとめたほうが速いと思ってそうしたいのですが、 変わらないのなら1文1文;でつなげて書くやり方でいこうと思っています。 まとめると速くなることはあるでしょうか?

    • ベストアンサー
    • MySQL
  • caseを使った条件分岐の加算がうまくいかない

    SQLで条件によって加算するか、しないかを判定したいと思っています。 ■テーブル:test name,flag,number mike,4,1 mike,4,2 mike,5,3 mike,6,4 mike,7,5 mike,8,6 mike,9,7 ■書いたSQL SELECT test.name AS "name", (CASE WHEN flag = '4' THEN sum(number) ELSE NULL END) AS "4", (CASE WHEN flag = '5' THEN sum(number) ELSE NULL END) AS "5", (CASE WHEN flag = '6' THEN sum(number) ELSE NULL END) AS "6", (CASE WHEN flag = '7' THEN sum(number) ELSE NULL END) AS "7", (CASE WHEN flag = '8' THEN sum(number) ELSE NULL END) AS "8", (CASE WHEN flag = '9' THEN sum(number) ELSE NULL END) AS "9" FROM test GROUP BY test.name ■結果 4,5,6,7,8,9 null,null,null,null,null,28 欲しい結果は、フラグが4ののものの合計。flagが「4」の場合は、「3」という結果が返ってきてもらいたいです。 flagが5の場合は、3が返ってきてもらいたいです。 SQLが間違っているのですが、どこが間違っているのかわかりません。どのように修正すればよろしいでしょうか?よろしくお願いします。 環境はSQLiteを使用しています。

  • 重複レコードの抽出

    Windows Server 2003上で、SQL Server 2000を 使用しています。下記のようなSQLを作成したいのですが、知識不足のためご助力願いたいのですが。 テーブル名 test フィールド seihin (1項目のみ) seihinの構成  先頭4バイト 製品コード   後半4バイト 連番(0000~9999) やりたいこと seihinの重複するレコードを含む 製品コードに対しそのコード別の件数の算出 例 xxxx0002,xxxx0011,yyyy1111が複数件あるとき、 seihinコードがxxxxであるもの全体の件数及び yyyyであるもの全体の件数 なお、下記のSQLにて重複レコードの抽出とカウントはできていますが、それ以降がわかりません。 select seihin,count(seihin) as scount from test group by seihin having (count(seihin)>1) 以上よろしくお願いいたします。

  • 重複データの抽出方法(複数項目)

    以下のようなテーブルからc列とd列のデータが重複しているレコードを取得したいために、以下のSQLを試してみました。 a列|b列|c列|d列 ---|---|---|--- 01 |01 |01 |01 02 |01 |01 |01 03 |02 |01 |03 04 |02 |02 |03 05 |01 |01 |02 06 |02 |02 |03 select * from テスト where c in (select c from テスト group by c,d having count(*)>1) and d in (select d from テスト group by c,d having count(*)>1) そうしたところ、以下の結果になってしまいました。 想定では、○のレコードだけ抽出できると思ったのです。 ×のレコードを抽出したくないのですが、SQLのどこが 間違っているのでしょうか? a列|b列|c列|d列 ---|---|---|--- 01 |01 |01 |01 ○ 02 |01 |01 |01 ○ 03 |02 |01 |03 × 04 |02 |02 |03 ○ 06 |02 |02 |03 ○ (使用DB)SQLServer2000

  • WHERE句でのCASEについて

    WHERE句でのCASEの使い方についてご教授下さい。 以下の3分岐でSELECTしようとしています。 項目A=1なら、 項目B / 1000=10 のデータを。 項目A=2なら、 項目C=C のデータを。 項目A=3なら、 項目B / 1000=10 かつ項目D=D のデータを。 ※しばらくPCに触れないので確認不可ですが以下は試みたい方法です。 ただ心配なのは、例えば項目A=1のときに項目B / 1000 = 10を満たすデータと満たさないデータが存在する場合、 満たすデータまでもが抽出されないのではという心配があります。 SELECT * FROM テーブル WHERE 1 = CASE WHEN 項目A=1 THEN CASE WHEN 項目B / 1000 = 10 THEN 1 ELSE END WHEN 項目A=2 THEN CASE WHEN 項目C = C THEN 1 ELSE END WHEN 項目A=3 THEN CASE WHEN 項目B / 1000 = 10 AND 項目D = D THEN 1 ELSE END ELSE END

  • 集計を求めるSQL文について

    こんにちは。 はじめまして、MMM-SRVと申します。 初めて投稿させて頂きます。 宜しくお願い致します。 MS Access2000をデータベースとしてASPでプログラムを組んでおります。 その中でどうしてもわからないので教えて下さい。 create table t1 ( age varchar(30), -- 年代 sex varchar(30), -- 性別(男'0'女'1') txt varchar(30) -- 氏名 ); というテーブルに age | sex | txt ----+-----+------   1 | 0  | A   2 | 0  | B   2 | 1  | C   1 | 1  | D   2 | 0  | E というデータがあるとして、ここから age | 男 | 女 ----+----+----   1 | 1  | 1   2 | 2  | 1 のように集計するSQL文をご教授頂けませんでしょうか。 postgrsであれば、以下のように組んでみるのですが case演算子がMS Accessでは使えないようなので…。 select age,sum(case when sex=0 then 1 else 0 end) as 男,sum(case when sex=1 then 1 else 0 end) as 女 from t1 group by age; 宜しくお願い致します。

  • グループ化データの割り算について

    SQLSERVER 言語 VB VS2008 いつも勉強させていただいています。 SQL文で 「0 除算エラーが発生しました。」 が出て、困っています。 アドバイスお願いいたします。 SQL文 COUNT(CASE WHEN CONVERT(CHAR(10), 納期, 111) = GETDATE() _ AND 入荷数 = 0 THEN 0 ELSE NULL END) _ / _ COUNT(CASE WHEN CONVERT(char(10), 納期, 111) = GETDATE() _ THEN 0 ELSE NULL END) * 100 AS '遅延率(%)' ・・・GROUP化 わかりずらいのですが、期間内の入荷数/全体数で割っています。 COUNTでも駄目でした。 個々のデータは取得できます。下記 COUNT(CASE WHEN CONVERT(CHAR(10), 納期, 111) = GETDATE() _ AND 入荷数 = 0 THEN 0 ELSE NULL END) AS 未入荷計 何か良い方法が御座いましたらご指導くださいませ。 よろしくお願いします。

  • SQL-SELECT文でのソート

    VB2010とmdb(Ms-Access)にてシステムを構築しています。 Select文にて取得したレコードをDatagridviewにて表示しようとしているのですが SQL="SELECT * FROM table ORDER BY ID" 当のシンプルなものだと表示できるのですが 特定の文字列順にソートしたくCASE WHENを使用して SQL = "SELECT * FROM table ORDER BY CASE BUPPIN WHEN '○○' THEN 1 WHEN '△△' THEN 2 ELSE 0 END" のようにSQLを書いてみたのですがデータアタプタにてデータテーブルに結果を入力させる際にエラーが出てしまいます。 構文間違いでしょうか? ご教授お願いします