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

このQ&Aのポイント
  • MS Access2000を使って、あるテーブルから年代ごとの男女の人数を集計するSQL文について教えてください。
  • MS Accessではcase演算子が使えないため、別の方法で集計する必要があります。
  • postgrsでは以下のようなSQL文を使用できますが、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;
回答を見る
  • ベストアンサー

集計を求める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; 宜しくお願い致します。

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

  • ベストアンサー
回答No.1

IIF関数が使えます。 IIF関数は、 IIF(条件, 条件が真の時の値, 条件が偽の時の値) と言うものです。 SQLは、 SELECT age,SUM(IIF(sex='0', 1, 0)) AS 男, SUM(IIF(sex='1', 1, 0)) AS 女 FROM t1 GROUP BY age; となります。

MMM-SRV
質問者

お礼

space_needle様 ご回答ありがとうございました(T_T)!! 明日、出社せずにすみませした!!またわからないところがありました、ご質問させていただきたいと思いますので宜しくお願い致しますm(__)m。

関連する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のところで構文エラーになります。 ここをどのように変えれば意図どおりの動きをするようになるのか知りたいです。 よろしくお願いします。

  • CASE文について

    <環境> SQLSERVER2005 ACCESS2007 CASE文について質問です。 クエリで下記のSQL文を実行すると、「Case 式は、10 レベルまでしか入れ子にできません。」 とエラーになります。 このような場合、どのように記述すれば解決できるでしょうか? ご教授お願いします。 SELECT CASE WHEN (WA.MM = '01') THEN ROUND(SUM(WB.MONEY1), -3, 0) ELSE CASE WHEN (WA.MM = '02') THEN ROUND(SUM(WB.MONEY2), -3, 0) ELSE CASE WHEN (WA.MM = '03') THEN ROUND(SUM(WB.MONEY3), -3, 0) ELSE CASE WHEN (WA.MM = '04') THEN ROUND(SUM(WB.MONEY4), -3, 0) ELSE CASE WHEN (WA.MM = '05') THEN ROUND(SUM(WB.MONEY5), -3, 0) ELSE CASE WHEN (WA.MM = '06') THEN ROUND(SUM(WB.MONEY6), -3, 0) ELSE CASE WHEN (WA.MM = '07') THEN ROUND(SUM(WB.MONEY7), -3, 0) ELSE CASE WHEN (WA.MM = '08') THEN ROUND(SUM(WB.MONEY8), -3, 0) ELSE CASE WHEN (WA.MM = '09') THEN ROUND(SUM(WB.MONEY9), -3, 0) ELSE CASE WHEN (WA.MM = '10') THEN ROUND(SUM(WB.MONEY10), -3, 0) ELSE CASE WHEN (WA.MM = '11') THEN ROUND(SUM(WB.MONEY11), -3, 0) ELSE CASE WHEN (WA.MM = '12') THEN ROUND(SUM(WB.MONEY12), -3, 0) END END AS MONEY FROM (WA INNER JOIN WB ON (WA.YYYY = WB.YYYY)) INNER JOIN WC ON (WA.YYYY = WC.YYYY)

  • SQLのグループ化動作について

    グループ化と集計関数の動作について質問させてください。 MySQL、SQLiteて実行しました。 [テーブル:ninzu_tbl] ken sex ninzu 福岡 1 50 福岡 2 60 佐賀 1 40 佐賀 2 30 長崎 1 60 長崎 2 50 性別(sex)でgroup byして人数を求めるSQLを実行した場合、 sumを使用するSQL(1)を実行すると福岡、佐賀、長崎のそれぞれの人数が表示されますが、 sumを使用しないSQL(2)を実行した場合、長崎の人数のみが表示され、福岡、佐賀の人数が 空白になります。 group byでグループ化した場合に、最後尾のキー項目以外のデータが 上書きされ、福岡、佐賀のデータが飛んでしまったのではと考えましたが、 (1)を実行した場合に県ごとのデータが表示される理由がわかりません。 理由がわかる方、教えていただけませんか? もしくは、グループ化の処理イメージができるサイトを教えてください。 よろしくお願いします。 (1) 結果が表示されるSQL select sex as '性別' , sum(case when ken = '福岡' then ninzu else null end) as '福岡' , sum(case when ken = '佐賀' then ninzu else null end) as '佐賀' , sum(case when ken = '長崎' then ninzu else null end) as '長崎' from ninzu_tbl group by sex (2) 福岡と佐賀の結果が表示されないSQL select sex as '性別' , case when ken = '福岡' then ninzu else null end as '福岡' , case when ken = '佐賀' then ninzu else null end as '佐賀' , case when ken = '長崎' then ninzu else null end as '長崎' from ninzu_tbl group by sex

  • Column名を変えた時のUpdate文の書き方

    よろしくお願い致します。 VB2010とSQLServer2008でデータベースの勉強をしております。 DataAdapterを使用し、SelectCommand,UpdateCommandを設定、 それをDataGridViewに表示させています。 Column名とデータをSelectComanndの「AS」で変更した場合の Update文の「CASE」の書き方?で混乱しております。 データベース Test1 No Sex ------ 1 1 2 2 3 0 DataGridViewの表示 No 性別 ------- 1 男 2 女 3 ? データベース Test1をDataGridViewに表示 その際、「Sex」を1=男, 2=女, 0=?と表示させています 同時に、Column名を「性別」に変えました SelectCommandでSQL文を以下のように設定しました SELECT No, CASE Sex WHEN 1 THEN '男'                WHEN 2 THEN '女'                ELSE '?'         END AS 性別 FROM Test1 これは希望通りに表示されました UpdateCommandでSQL文を以下のように設定しました。 UPDATE Test3 SET Sex = CASE @sex WHEN '男' THEN 1                         WHEN '女' THEN 2                         ELSE 0                 END WHERE No = @no SQLDataAapter.UpdateCommand = New SqlCommand(SQL, myConnection) SQLDataAapter.UpdateCommand.Parameters.Add("@sex", SqlDbType.Int, 32, "Sex") SQLDataAapter.UpdateCommand.Parameters.Add("@no", SqlDbType.Int, 32, "No").SourceVersion = DataRowVersion.Original UPDATE文でCASEが使えることは検索して分かったのですが、 Columnの表示を変えた場合はどうしたらよいのでしょうか? なお、Select文、Update文ともに、「CASE」句を削除すれば正しく動作することは確認できました。 質問する場所を「データベース」と迷ったのですがこちらにしました。 ご指導のほど、よろしくお願い致します

  • 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を使用しています。

  • SQLServer2005のSELECT文作成について

    SQLServer2005初心者ですが、おわかりになる方いらっしゃいましたら、教えてください。お願いします。 やりたいことは(下記は間違いのSELECT文ですが) SELECT Nomber , SUM(ISNULL(CASE WHEN KenYY + KenMM = '200711' THEN Siyoryo ELSE 0 END, 0)) AS '2007年11月' , SUM(ISNULL(CASE WHEN KenYY + KenMM = '200712' THEN Siyoryo ELSE 0 END, 0)) AS '2007年12月' ,  MAX(ISNULL(CASE WHEN RecNO = MIN(RecNO) THEN Sedai ELSE '' END, '')) Sedai_MIN ,  MAX(ISNULL(CASE WHEN RecNO = MAX(RecNO) THEN Sedai ELSE '' END, '')) Sedai_MAX FROM TABLE GROUP BY Nomber で、SELECTの最後のSedai_MIN,Sedai_MAXで集計関数を2回使っているので、エラーがでるのは分かるのですが、始めのMAXを消すとGROUPBY句にSedaiとRecNOが含まれていないというエラーがでて、GROUPBYに追加すると、同じNomberが複数でてしまうのです。 同じNomberは1つしか出ないようにする場合、上記のSELECT文をどのように変更すればよろしいのでしょうか? 回答よろしくお願いいたします。

  • 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を書いてみたのですがデータアタプタにてデータテーブルに結果を入力させる際にエラーが出てしまいます。 構文間違いでしょうか? ご教授お願いします

  • SQL分の作り方

    以下のようなテーブルがあります name point date A 1 2014/1/1 B 2 2014/1/1 C 3 2014/1/1 A 1 2014/2/1 B 3 2014/2/1 C 2 2014/2/1 A 2 2014/3/1 B 4 2014/3/1 C 3 2014/3/1 上記のテーブルを name point(2014/1) point(2014/2) point(2014/3) A 1 1 2 B 2 3 4 C 3 2 3 というように並べるにはどのようなSQLを打てばよいでしょうか。 以下のようなSQLを打ってみたらデータ量が多いときになかなか応答が帰ってきません。 SELECT name, ifnull(sum(CASE WHEN date = '2014-01-01' THEN point END),'-') as point(2014/1),ifnull(sum(CASE WHEN date = '2014-02-01' THEN point END),'-') as point(2014/2),ifnull(sum(CASE WHEN date like '2014-03-01' THEN point END),'-') as point(2014/3) FROM tableA GROUP BY name

  • sqlについての質問

    お世話になります。 下記コードにて、抽出されたデータに不備があります。 「q2.新新品番(+) = A.品番」としていますが、 完全一致しない品番が見受けられ、trimを使ったら 良いのではと思うのですが、どこにtrimを入れたら 良いのか、又は考え方自体違うのか 現在テンパっている所でございます。 どなたか良いアドバイスを頂けたらと思い、 ご質問させて頂きました。 何卒、ご教示頂けます様、宜しくお願い致します。          記 select case when substr(q2.新新品番,8,1)='_' then substr(q2.新新品番,1,7) else q2.新新品番 end as 品番 ,SUM(q2.新新合格数) AS 生産合格数 ,A.伝票ID,A.品番,A.新入庫数量 as 区画入庫数,A.区画番号 from ( select case when substr(q1.新品番,6,1)='_' then substr(q1.新品番,1,5) else q1.新品番 end as 新新品番 ,SUM(q1.新合格数) AS 新新合格数 from ( SELECT 更新日時, case when substr(ハンドル,7,1)='_' then substr(ハンドル,1,6) else ハンドル end as 新品番 ,SUM(合格本数) AS 新合格数 FROM D最終検査履歴 WHERE 更新日時 BETWEEN '2012-5-31' and '2012-6-01' group by 更新日時, case when substr(ハンドル,7,1)='_' then substr(ハンドル,1,6) else ハンドル end )q1 group by case when substr(q1.新品番,6,1)='_' then substr(q1.新品番,1,5) else q1.新品番 end )q2 , (select 伝票ID,品番,sum(入庫数量)as 新入庫数量,区画番号 from D屋外入庫 where 登録日時 between '2012-5-31' and '2012-6-01' and 伝票ID='SN' group by 伝票ID, 品番, 区画番号 )A where q2.新新品番(+) = A.品番 group by case when substr(q2.新新品番,8,1)='_' then substr(q2.新新品番,1,7) else q2.新新品番 end, A.伝票ID, A.品番, A.新入庫数量, A.区画番号

  • PLSQLのCASE文でNULLを評価する際の動作について

    PLSQLのCASE文でNULLを評価する際の動作について PLSQLのCASE文でNULLを評価する時、下記の例1ではNULLを判定できず、 例2を使えばNULLを判定できました。 問題は解決したのですが理屈がわかりません。 ご存知の方、教えてください。 --例1 DECLARE MOJI VARCHAR2(1); BEGIN CASE MOJI WHEN NULL THEN DBMS_OUTPUT.PUT_LINE('NULL DESU'); ELSE DBMS_OUTPUT.PUT_LINE('NULL DEHA NAI'); END CASE; END; --例2 DECLARE MOJI VARCHAR2(1); BEGIN CASE NVL(MOJI,' ') WHEN ' ' THEN DBMS_OUTPUT.PUT_LINE('NULL DESU'); ELSE DBMS_OUTPUT.PUT_LINE('NULL DEHA NAI'); END CASE; END;