テーブルに対して別々の条件で集計する方法

このQ&Aのポイント
  • テーブルに対して異なる条件で集計する方法を1回のSQLで行うことは可能でしょうか。
  • 以下のサンプルデータを使用して、CDごとにFLGの値で集計した結果を出力したいです。
  • 通常のSUM関数を使用して集計すると、CDごとにFLGの値ごとに行が表示されるため、集計結果を横展開する方法を試みていますがうまくいきません。
回答を見る
  • ベストアンサー

1テーブルに対して別々の条件で集計する方法

以下のような集計を、VIEWを使わずに1回のSQLでできますでしょうか。 【対象TBL】 CD FLG KINGAKU A, 0, 100 A, 0, 200 A, 1, 1000 B, 0, 50 B, 1, 60 【出したい結果】 CD KINGAKU_0 KINGAKU_1 A, 300, 1000 B, 50, 60 普通のSUMで出る以下の結果を、サブクエリなどで横展開しようと試みてるのですが、 うまく出来ません。。 CD FLG KINGAKU A, 0, 300 A, 1, 1000 B, 0, 50 B, 1, 60

  • Oracle
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

「FLG」が「0」か「1」だけ判断すればいいのなら SELECT CD, SUM( CASE WHEN FLG=0 THEN KINGAKU ELSE 0 END ) KINGAKU_0, SUM( CASE WHEN FLG=1 THEN KINGAKU ELSE 0 END ) KINGAKU_1 FROM テーブル名 GROUP BY CD

kokondou
質問者

お礼

ありがとうございます。感動しました。

その他の回答 (1)

  • dda167
  • ベストアンサー率76% (55/72)
回答No.2

SELECT CD, SUM(CASE WHEN FLG = 0 THEN KINGAKU ELSE 0 END) AS KINGAKU_0, SUM(CASE WHEN FLG = 1 THEN KINGAKU ELSE 0 END) AS KINGAKU_1 FROM 対象TBL GROUP BY CD;

kokondou
質問者

お礼

ありがとうございます。感動しました。

関連するQ&A

  • 2つのテーブルでの集計

    こんにちは。 1日悩んでまだ解決出来ないのでちょっと質問に参りました。 以下のような感じのテーブルがあるとして ● T1 名前|A_id|B_id| AAAA|1111|----| BBBB|----|2222| CCCC|3333|4444| ● T2 A_id|金額 1111|2000 3333|1000 1111|4000 ● T3 B_id|金額 2222|2000 4444|4000 ● 抽出結果でやりたいこと →SUM(A_idの金額)とSUM(B_idの金額)を足した金額が5000以上のみ抽出 名前|A_id|B_id|A金額|B金額|横の合計| AAAA|1111|----|6000 |-----|6000 CCCC|3333|4444|1000 |4000 |5000 テーブル同士はLEFT JOINで繋がっており A_id B_idの合計はそれぞれ SUM()を使って、とりあえず出ている状態です あとはA_id と B_idの合計を出して、5000以上のみ抽出で終わりですが 1.SUM(A_id) とSUM(B_id)の合計方法 2.5000以上の判別方法 をどうするか で試行錯誤しているところです。 PHPで無理矢理 判別させれば表は出せると思うのですが、SQL文(というのでしょうか)の中でどうにかしたいと思っています。 SUMの使い方やHAVING WHERE の使い方・使いどころなどが微妙にわからず うまく応用出来ないので、こういう使い方があるよ・出来るよ といった 参考例があれば教えて頂けますでしょうか。ヨロシクお願いします。 MySQL クライアントのバージョン: 5.0.45

    • ベストアンサー
    • MySQL
  • サブクエリを利用したSQL文から複数の抽出条件

    例えば、以下のようなサブクエリを利用したSQL文があります。 SELECT table_a.* FROM table_a LEFT JOIN (SELECT table_b.* FROM table_b LEFT JOIN table_c ON (table_b.id = table_c.bid) WHERE table_b.type='1') AS tbl ON (table_a.id = tbl.aid) このSQL文にWHERE句で条件を指定したいのですが、サブクエリで指定しているtblテーブルのvalueフィールドが「1」と「20」のものを抽出したいと思います。 WHERE (tbl.value='1' AND tbl.value='20') としても結果が帰って来ません。 これは、WHEREする条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。

  • サブクエリなしで2つのテーブルを集計する方法

    テーブルA id|cnt|name 1 2 田中さん 2 5 鈴木さん テーブルB id|cnt|name 1 4 田中さん 2 4 鈴木さん サブクエリを使用せず、上記2つのテーブルを集計し、 下記のように出力できるSQLはありますでしょうか? ■期待する総合ランキング結果 id|cnt|name 2 9 鈴木さん 1 4 田中さん P.S まだまだ、安価なレンタルサーバはMySQLは4.0が多く苦労します・・

    • ベストアンサー
    • MySQL
  • 3テーブルの外部結合

    3テーブルよりを以下の条件で1つのSELECT文で集計したいのですが可能でしょうか?  ・A_TBLのA単位でB_TBLのNYUKAとC_TBLのSYUKAを集計 <<A_TBL>>   <<B_TBL>>     <<C_TBL>> A  STOCK   B  A NYUKA   C  A SYUKA a01  100    b01 a02 10   c01 a03 10 a02  200    b02 a01 20   c02 a01 20 a03  300    b03 a01 10   c03 a05 10 a04  400    b04 a03 30   c04 a01 30 a05  500    b05 a05 30   c05 a03 20            b06 a02 20   c06 a01 10            b07 a01 10   c07 a03 50 外部結合 SELECT a.A,a.STOCK,SUM(b.NYUKA) AS SUM_NYUKA,SUM(c.SYUKA) AS SUM_SYUKA FROM A_TBL AS a". LEFT OUTER JOIN B_TBL AS b ON a.A=b.A LEFT OUTER JOIN C_TBL AS c ON a.A=c.A". GROUP BY a.A でうまくいきません。3つ以上のテーブルの外部結合の記述が間違っているのはわかるのですが、 どのように記述すればよいか、ネットで検索してもわかりませんでした。 宜しくお願い致します。

  • 3テーブルより抽出のSQL文

    3テーブルよりを以下の条件で1つのSELECT文で抽出したいのですが可能でしょうか?  ・C_TBLのDATEが2007のデータ〔SUBSTR(DATE,1,4)='2007'を使用?〕  ・A_TBLのCORPがcorp1のデータ(あいまい検索)  ・CORP(昇順)、DATE(降順)、ITEM(昇順)でソート ・表示カラムは、CORP・DATE・ITEM・SURYO・TANKAです <<A_TBL>>   <<B_TBL>>         <<C_TBL>> A  CORP    B  A  ITEM TANKA   C  A  B   DATE  SURYO a01 corp11   b01 a02 item03 10   c01 a03 b06 2007-11-01 100 a02 corp13   b02 a03 item01 20   c02 a01 b03 2007-12-01 200 a03 corp11   b03 a01 item03 10   c03 a05 b04 2007-11-01 100 a04 corp05   b04 a05 item02 30   c04 a01 b05 2007-11-01 300 a05 corp13   b05 a01 item02 30   c05 a03 b06 2007-12-01 200            b06 a03 item03 20   c06 a01 b05 2007-11-02 100            b07 a01 item01 10   c07 a03 b02 2007-11-01 500 また、以下の条件で集計を1つのSELECT文で行えますか? 現在は、C_TBLとB_TBLで集計抽出し、A_TBLの対象データを抽出し、2つの配列より・・・ というロジックを組んでいます。  ・C_TBLのDATEが2007のデータ〔SUBSTR(DATE,1,4)='2007'を使用?〕  ・A_TBLのCORPがcorp1のデータ(あいまい検索)  ・CORP(昇順)、DATE(降順)でソート ※DATEは年月のみです  ・CORP、DATE(年月)毎で金額を集計〔SUM(C_TBL.SURYO*B_TBL.TANKA) AS KINGAKU〕 ・表示カラムは、CORP・DATE・金額です 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • 5テーブルを1クエリで抽出&集計

    A_TBL:オーダー(親)情報⇒受注先 B_TBL:オーダー(子)情報⇒受注品 C_TBL:出荷情報 D_TBL:受注先情報 E_TBL:〆日情報 <<A_TBL>>   <<B_TBL>>     <<C_TBL>> A  CORP  B  A ITEM ORDER  C  A  B SYUKA DATE a01 AAA  b01 a01 XXX 20  c01 a01 b01 10 01/05 a02 BBB  b02 a01 YYY 20  c02 a03 b03 10 01/10 a03 AAA  b03 a03 ZZZ 10  c03 a03 b07 10 01/05         b04 a02 XXX 30  c04 a02 b02 10 02/15         b05 a01 ZZZ 30  c05 a02 b06 20 01/25         b06 a02 YYY 20  c06 a01 b01 10 01/20         b07 a03 XXX 10  c07 a01 b02 10 02/10 <<D_TBL>>    <<E_TBL>> D  CORP SHIME  E SHIME   d01 AAA  e01   e01 末日 ⇒ 01~月末 d02 BBB  e02   e02 20日 ⇒ 21~20日(1月が12/21~1/20を集計) d03 CCC  e01   e03 10日 ⇒ 11~10日 $_POST[YYYY]と$_POST[MM]で受け渡された年月で CORP毎で集計サイクル毎にSYUKAを集計したいのですが。 ネックとなっているのが、会社毎に集計サイクルが違うことです。 1クエリで可能でしょうか?不可なら件数が多いのでできるだけ短時間でするには?を教えていただきたいのですが。

  • 集計のSQLについて

    皆さんの知恵をお借りしたいと思っています。 どなたか、良い案がある方お願いいたします。 以下のテーブルがあります。 (売上テーブル) 品名   金額   購入者 ---------------------------- 鉛筆   20    Aさん 鉛筆   40    Bさん 鉛筆   30    Bさん 鉛筆   30        鉛筆   10        上のテーブルで、品名・購入者を集計キーとして、 金額を集計したい場合、 SELECT 品名,購入者,SUM(金額) FROM 売上テーブル GROUP BY 品名,購入者  というSQL文で,   品名   金額   購入者 ---------------------------- 鉛筆   20    Aさん 鉛筆   70    Bさん 鉛筆   40        という結果が得られると思いますが・・・、 これを、 品名   金額   購入者 ---------------------------- 鉛筆   20    Aさん 鉛筆   70    Bさん 鉛筆   30        鉛筆   10        という結果になるようなSQL文を作りたいのです。 購入者が入っているものについては、品名・購入者で集計して、 購入者が空欄のものは集計しないようにしたいと思っています。 UNIONを使えばできるとは思うのですが、 それ以外の方法で、1回のSQL文でできる方法があれば知りたいと思っています。 よろしくお願いします。

  • ACCESSのクエリで同じSQL文だが結果が異なる

    ACCESS2003にて 選択クエリAをSQLビューで開きSQL文をコピー、 新規作成したクエリBのSQLビューに貼り付けて実行したところ、 AとBで結果の件数が異なりました。 そのままBを保存して終了。 BをSQLビューで開き、 SQL文の末尾の;を削除して実行すると、 Aと同じ件数の結果になりました。 再度Bを保存して終了し、 BをSQLビューで開き、 SQL文の末尾の;を削除して実行すると、 Aと異なる件数(元の結果)になりました。 何が原因なのでしょうか。 SQL文の内容は、サブクエリを含んでいて、サブクエリのFROMは SQLSERVERのリンクテーブルです。 よろしくお願いします。

  • まだSQL初心者なので、よくわかっていないようです。

    まだSQL初心者なので、よくわかっていないようです。 Viewの作り方がうまくいきません。 各テーブルの数値(PLAYCNT)の合計数を出力する VIEWを作成したいだけなのですが。。 これ↓を実行すると、mysqladminがフリーズしたようになって レコード数に~02(2は乗数) という変な数字が入ってしまいます。 これはいったいどうしてなのか分からず困っています。 CREATE VIEW ALLPLAY_TBL AS SELECT SUM(A.PLAYCNT) NORMAL_CNT, SUM(B.PLAYCNT) HARD_CNT, SUM(C.PLAYCNT) SPECIAL_CNT, SUM(D.PLAYCNT) MANIAC_CNT FROM NORMAL_TBL A, HARD_TBL B, SPECIAL_TBL C, MANIAC_TBL D

  • 集計の方法について

    下記のようなテーブル(tbl)があり Code Name ------------ A1   A-1 A1   A-2 A1   A-3 B1   B-12 B1   B-13 C1   C-9 以下の結果を取得したいのですが Code Name ------------ A1 A-1 B1 B-12 C1 C-9 です。Accsessでは SELECT Code, First(Name) FROM tbl GROUP BY Code; などと書けるのですがPostgresSQL V9.1ではどのように書けばよいのでしょうか? Window関数かと思いますが、旨く結果が得られません。 初歩的な質問で申し訳ありませんが、教えていただけませんか?