テーブルに対して別々の条件で集計する方法
- テーブルに対して異なる条件で集計する方法を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
- kokondou
- お礼率75% (6/8)
- Oracle
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「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
その他の回答 (1)
- dda167
- ベストアンサー率76% (55/72)
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;
お礼
ありがとうございます。感動しました。
関連する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する条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。
- 締切済み
- MySQL
- サブクエリなしで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つ以上のテーブルの外部結合の記述が間違っているのはわかるのですが、 どのように記述すればよいか、ネットで検索してもわかりませんでした。 宜しくお願い致します。
- 締切済み
- MySQL
- 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クエリで可能でしょうか?不可なら件数が多いのでできるだけ短時間でするには?を教えていただきたいのですが。
- 締切済み
- MySQL
- 集計の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文でできる方法があれば知りたいと思っています。 よろしくお願いします。
- ベストアンサー
- Oracle
- 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
- 締切済み
- MySQL
- 集計の方法について
下記のようなテーブル(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関数かと思いますが、旨く結果が得られません。 初歩的な質問で申し訳ありませんが、教えていただけませんか?
- ベストアンサー
- PostgreSQL
お礼
ありがとうございます。感動しました。