• 締切済み

単一グループのグループ関数ではありませんについて

以下の様なテーブルがあります。 SOSHIKI_CODE SYAIN_CLS DEL_DATE A部 0 A部 1 B部 1 B部 2 C部 3 組織毎の社員クラスをカウントしたいのですが、 以下のSQLを実行すると ORA-00937: 単一グループのグループ関数ではありません。 のエラーがでます。 どこがいけないのでしょうか。 いけない理由が知りたいのですが。 また、どこを直せばよいのでしょうか。 select soshiki_code -- ,syain_cls ,max(decode(syain_cls,'0',count(*),NULL)) ,max(decode(syain_cls,'1',count(*),NULL)) ,max(decode(syain_cls,'2',count(*),NULL)) ,max(decode(syain_cls,'3',count(*),NULL)) from syain_mst where del_date is NULL group by soshiki_code ,syain_cls order by soshiki_code ;

みんなの回答

  • dell_OK
  • ベストアンサー率13% (742/5652)
回答No.2

すんなりかけました。 SELECT soshiki_code, sum(decode(syain_cls, '0', 1, NULL)) AS cls0_count, sum(decode(syain_cls, '1', 1, NULL)) AS cls1_count, sum(decode(syain_cls, '2', 1, NULL)) AS cls2_count, sum(decode(syain_cls, '3', 1, NULL)) AS cls3_count FROM syain_mst WHERE del_date IS NULL GROUP BY soshiki_code ORDER BY soshiki_code ; グループ関数maxの中にグループ関数countがあったためにエラーになっていたように思います。

abc999xyz
質問者

お礼

ありがとうございます。 グループ関数の中にグループ関数がいけないのですね。 countもグループ関数です。 エラーメッセージの通りになります。

全文を見る
すると、全ての回答が全文表示されます。
  • dell_OK
  • ベストアンサー率13% (742/5652)
回答No.1

どこがいけないのか説明が難しくてできませんが、 やりたいことはこのようなことでしょうか。 WITH s AS ( SELECT soshiki_code, decode(syain_cls, '0', 1, NULL) AS c0, decode(syain_cls, '1', 1, NULL) AS c1, decode(syain_cls, '2', 1, NULL) AS c2, decode(syain_cls, '3', 1, NULL) AS c3 FROM syain_mst WHERE del_date IS NULL ) SELECT soshiki_code, sum(c0) AS cls0_count, sum(c1) AS cls1_count, sum(c2) AS cls2_count, sum(c3) AS cls3_count FROM s GROUP BY soshiki_code ORDER BY soshiki_code 結果 SOSHIKI_CODE CLS0_COUNT CLS1_COUNT CLS2_COUNT CLS3_COUNT A部 1 1 « NULL » « NULL » B部 « NULL » 1 1 « NULL » C部 « NULL » « NULL » « NULL » 1

abc999xyz
質問者

お礼

ありがとうございます。 with句を使われていますが、 select文中のselect文の副問合せ見たいにしないと ダメなんですね。 説明も難しいですね。

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

関連するQ&A

  • 以下の場合のSQL文の書き方教えてください。

    2つのテーブルÅ、Bに同じ項目名(NYUSYA_DATE)が存在していて、 通常はAからデータを取得し、取得した値がNULLの場合は、Bから取得します。 これを1つのSQLで出来ますか? 今は、両方取得しておいて、IF文で判定しようとしています。 テーブルA SYAIN_ID (NOT NULL) NYUSYA_DATE テーブルB GROUP_ID (NOT NULL) SYAIN_ID NYUSYA_DATE

  • group by のソート

    mysql Client API version 3.23.49 PHP/4.4.5 で動作させようと思っています。 table a   b 1   2 3   4 2   4 7   1 2   6 1   6 上のデータから以下のような結果を得たいのですが table a   b  idcount1 1   6    2 3   4    1 2   6    2 7   1    1 グループで集計をとり、その上でbに6がある場合は6その他は bの値にNULLもしくは別の値が入るという形でいいのですが・・・ できません。 SELECT a, b, count( * ) AS idcount1 FROM table GROUP BY a するとはじめに読みこんだ値がbには入ってしまいます。 結果 table a   b  idcount1 1   2    2 3   4    1 2   4    2 7   1    1 SELECT a, b, count( * ) AS idcount1 FROM table where b=6 GROUP BY a するとbの値ははじきますし、カウントしている意味がなくなります。 結果 table a   b  idcount1 1   6    1 2   6    1 GROUP BY 処理前のソートを考え、from table後に oder by b=6 asc を使ったがエラー 末尾に oder by b=6 asc を使うと最初に試した値をソートするだけでした。 宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • PL/SQL グループ化について

    こんにちは。 現在以下のようなソースが存在するのですが、以下beforeのgroup byに設定している「D」をグループ化の対象外にしなければなりません。 ただし、「D」はSELECT対象であり、かつデータが文字型であり、集計関数の使用対象外(使用した場合に意図した結果とならない)などといった事情があり、単純にgroup by句から外すという対応ではうまくいきません。 誠に恐縮ですが、お知恵をお貸しいただけませんでしょうか? 【before】 ----------------------------------------------------- INSERT INTO 出力テーブル ( A , B , C , D ) SELECT  MIN(テ1.A) AS 別名A,     MAX(テ1.B) AS 別名B,     MAX(テ1.C) AS 別名C,     テ1.D FROM   テーブル1 テ1 WHERE  EXISTS      ( SELECT 0      FROM テーブル2 テ2    JOIN        テーブル3 テ3    ON  テ2.A = テ3.A      WHERE テ1.C = テ2.C      HAVING SUM(DECODE(テ3.G,'Yes',0,1)+DECODE(テ3.H,'Yes',0,1)) = 0 ) GROUP BY テ1.A,     テ1.B,    テ1.C,    テ1.D ;    ←ここを外したいです -----------------------------------------------------

  • グループ関数のエラーについて

    下記SQLを実行するとエラーが返ってきます。 構文は合っていると思うのですが何故でしょうか。 1 select nation 2 from nation 3 group by nation 4* having area > avg(area) SQL> / having area > avg(area) * 行4でエラーが発生しました。: ORA-00979: GROUP BYの式ではありません。 副問合せをするとうまくいきました。 1 select nation 2 from nation 3* where area >(select avg(area) from nation) どちらの方法も同じ考え方だと思うのですが、上のやり方でエラーが出る理由を教えてほしいです。 回答のほどよろしくお願い致します。 SQL> desc nation; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- CODE NOT NULL NUMBER(5) NATION NOT NULL VARCHAR2(28) CAPITAL VARCHAR2(20) AREA NUMBER(22) POPULATION NUMBER(22)

  • グループ関数の結果について

    以下、SQLコマンドを入力するとレコードが選択されない結果になってしまいます。areaの平均より高いものが出力されるはずなのですが何故でしょうか? / 1 select nation,area 2 from nation 3 group by nation, area 4* having area > avg(area) SQL> / レコードが選択されませんでした。 SQL> desc nation; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- CODE NOT NULL NUMBER(5) NATION NOT NULL VARCHAR2(28) CAPITAL VARCHAR2(20) AREA NUMBER(22) POPULATION NUMBER(22)

  • SQL GROUP BY

    SQLについてお聞きしたいです。番号カラムの中で最大の数字をもつフィールドと 同じコードを持つデータを、表から全て取得したいと思っているのですが 書き出すとGROUP BYの式が間違っているというエラーが出てしまいます。 SELECT * FROM 表 GROUP BY コード HAVING MAX(番号) = コード どう調べればいいのか分からず四苦八苦しています。どこを直せばよいでしょうか?

  • グループ化したあとソートしたい

    MySQL4.1(Windows)での質問です。 以下のようなテーブルのA列をグループ化して、そのcount(A)の値でソートしたいのですが、エラーになってしまい、実行できません。どうすれば良いでしょうか? テーブル A|B ----- 0|aaa 1|bbb 2|ccc 1|ddd 1|eee 0|fff クエリ select A,count(A) from table group by A order by count(A) 表示させたいデータ A|count(A) ---------- 1|3 0|2 2|1

    • ベストアンサー
    • MySQL
  • GROUP BYを使用したCOUNT

    いつもお世話になっております。 現在下記のようなSQLを発行していまして、 件数を取得したいのですが、取得データの結果が 0件以外の時は良いのですが、0件の時は 「レコードが選択されませんでした」と表示されてしまいます。 何とか0件で表示できないでしょうか? SELECT COUNT(*) FROM T_M_MAKER HAVING MAKER_CD = '010' GROUP BY MAKER_CD 苦し紛れに SELECT DECODE(COUNT(*),'',0,COUNT(*)) FROM T_M_MAKER HAVING MAKER_CD = '010' GROUP BY MAKER_CD というのもやってみましたが、結果は一緒でした。 どなたかお分かりになる方、回答をお願いします。

  • SQLでグループ化した結果の件数を求めるには?

    下記のようなグループ化した結果を表示するSQL文を作りました。 SELECT メーカコード FROM 部品表 GROUP BY メーカコード, 部品番号 HAVING ((部品番号)="BUHIN1") これを実行するとちゃんと結果が出るのですが、その結果の件数を求めるにはどのようなSQL文を追加すれば宜しいのでしょうか? COUNT文を使うと出来そうなのですが、 SELECT メーカコード, COUNT(メーカコード) AS CNT FROM 部品表 GROUP BY メーカコード, 部品番号 HAVING ((部品番号)="BUHIN1") とやるとメーカコードの個別件数が表示されてしまいます。 どうぞよろしくお願いします。

  • SQL文作成のお願い

    前提として下記のようなテーブルがあります。 テーブル名:test フィールド: 1)id: varchar, not null 2)name: varchar 3)date: timestamp with time zone, not null このテーブルに下記のようなレコードがあります。 '00001', 'A', '2005-01-01 00:00:00' '00001', 'B', '2005-07-01 00:00:00' '00001', 'C', '2005-11-01 00:00:00' '00002', 'X', '2005-01-20 00:00:00' '00002', 'Y', '2005-07-20 00:00:00' '00002', 'Z', '2005-11-20 00:00:00' ■今やりたいこと このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。 ■やってみたこと 下記SQLを発行しました。 >select id, max(date) from test group by id order by id 結果==> 00001 2005-11-01 00:00:00 00002 2005-11-20 00:00:00 実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。 ■だめだったSQL select id, name, max(date) from test group by id order by id どのようにSQLを書けばよろしいでしょうか?