集計のSQLをお教え下さい
- 初心者でも分かる集計のSQLの記述方法をご説明します。
- テーブルの特定のカラムの値を集計するためのSQLの書き方をお教えします。
- 年月と場所コードでデータを集計するためのSQLの例をご紹介します。
- ベストアンサー
集計のSQLをお教え下さい
初心者ですよろしくお願いします。 以下の様なテーブルがあり、年月と場所コードで 件数を出したいと考えております。 申し訳ありませんが、SQLの記述をお教え下さい。 年月日 | 場所コード | 20060510 1000 20060511 1000 20060511 2000 20060512 2000 20060601 1000 20060601 2000 ・ ・ ↓ 年月日 | 場所コード | count 200605 1000 2 200605 2000 2 200606 1000 1 200606 2000 1 年月日を年月にして集計したいと考えています。 select 年月日,場所コード,count(*) from table group by substring(年月日 from 1 for 6) ではうまくいきませんでした・・・ よろしくお願いします。
- ken1low
- お礼率70% (78/111)
- MySQL
- 回答数1
- ありがとう数2
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
質問の際はバージョンくらい書いてください。 何を参考にSQLをおかきになったのかがわかりませんが、 ご指摘の内容であれば以下のような感じになると 思います。 SELECT SUBSTRING(`年月日`,1,6) AS `年月日`,`場所コード`,COUNT(*) AS `count` FROM `table` GROUP BY `年月日`,`場所コード`
関連するQ&A
- 重複データの集計方法を教えてください。
テーブル名:テスト コード 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がでればいいです。 よろしくお願いします。
- ベストアンサー
- SQL Server
- PL/SQLでの、集計→結合→集計の仕方
いつもお世話になってます。 以前こちらで質問をさせていただいたのですが、 http://soudan1.biglobe.ne.jp/qa5076670.html さらに分からないことが出てきたので、また質問させていただきます 【テーブル1】 (年月日) (班) (回数) (秒) (種類) 20090401|aaa| 10| 100 A 20090401|aaa| 20| 200 A 20090501|bbb| 10| 150 B 20090501|bbb| 20| 100 B 20090401|ccc| 10| 100 C 20090401|ccc| 30| 250 C 20090401|ddd| 15| 200 A : : : まずこれを集計し、件数を追加して (班) (回数) (秒) (件) (種類) aaa| 30| 300| 2 A bbb| 30| 250| 2 B ccc| 40| 350| 2 C ddd| 15| 200| 1 A : : : : というようにまとめ、 【テーブル2】 (年月) (班) (円) 200904| aaa| 1000 200905| bbb| 1500 200904| ccc| 2000 200904| ddd| 1200 : : : というテーブルと結合して (年月) (班) (回数) (秒) (円×件) (種類) 200904| aaa| 30| 300| 2000 A 200905| bbb| 30| 250| 3000 B 200904| ccc| 40| 350| 4000 C 200904| ddd| 15| 200| 1200 A : : : : : とするのが前回までで ここから更に種類で集計をして (年月) (回数) (秒) (円×件) (種類) 200904 | 45| 500| 3200| A 200905 | 30| 250| 3000| B 200904 | 40| 350| 4000| C としたいのですが、 SELECT テーブル2.年月, テーブル1集計.種類, sum(テーブル1集計.回数), sum(テーブル1集計.秒数), sum(テーブル1集計.件数 * テーブル2.円) FROM (SELECT 年月日, 班, 種類, sum(回数) 回数, sum(秒数) 秒数, count(*) 件数 FROM テーブル1 GROUP BY 班,種類,年月日) テーブル1集計,テーブル2 WHERE テーブル1集計.班=テーブル2.班 GROUP BY 種類,テーブル2.年月; としたところ、最終的に出力したいテーブルの集計結果の (回数) (秒) (円×件)が正しいものより多くなってしまいました。 長くなって申し分かりません。 どこが間違っているのか、わかる方いらっしゃいましたら 教えていただけないでしょうか??
- 締切済み
- Oracle
- データの件数を集計するための SQL
データの件数を集計するための SQL について教えてください。 例えば以下のようなテーブルがあります。 ▼テーブル 名前 |交通手段|日付 -----+--------+---- Aさん|バス |5/1 Aさん|バス |5/2 Aさん|バス |5/3 Bさん|バス |5/1 Bさん|電車 |5/2 ※「日付」については、本質問に直接の関係はありません。 このテーブルにクエリを発行して、以下の結果を取得したいと考えています。 ▼取得したい結果 名前 |交通手段|回数 -----+--------+---- Aさん|バス |3 Bさん|バス |1 Bさん|電車 |1 当方がイメージしている流れは以下の通りです。 SQL は苦手でして、これをひとつにまとめることができません。 1) GROUP BY で束ねる SELECT 名前, 交通手段 FROM テーブル GROUP BY 名前, 交通手段 2) 1)の結果の1件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Aさん' AND 交通手段='バス' 3) 1)の結果の2件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Bさん' AND 交通手段='バス' 4) 1)の結果の3件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Bさん' AND 交通手段='電車' なおレンタルサーバ上 (MySQL 5.0.77) で稼働させるため、 なるべく高速な SQL を希望いたします。
- ベストアンサー
- MySQL
- SQL 件数取得を速くしたい
SQLでテーブルなどからSELECTされた件数を得る際に、 select count(*) from ~ 等とするかと思いますが、この結果が返ってくるのが遅くて困っています。 少しでも速く件数を得たいのですがどのような方法がありますでしょうか? 教えてください。 私が使っている環境はOracle 8iで 特に今回はgroup byを含むビューからの検索を行おうとしています。
- ベストアンサー
- その他(データベース)
- クロス集計での order by句の使い方
下記の order byの部分を年月日でなく合計件数順に並べ変えたいのですが、Count(氏名)を入れると「 order by句で集計関数は使えません」のようなメッセージが出ます。(access2000) 何か良い方法はないでしょうか。 TRANSFORM Count(氏名) AS 氏名のカウント SELECT 年月日, Count(氏名) AS 合計件数 FROM 日誌 GROUP BY 年月日 ORDER BY 年月日 PIVOT 区分; #access素人です。
- ベストアンサー
- その他(データベース)
- 1個のSQL分で2種類以上の件数値を取得する
SQL分の記述で質問なんですが、 データベース上に日付、時間、フラグと言う項目があります。 同一の日付、時間のものは数件ずつあります。 フラグは"b"と"1"があります。 このデータの日付・時間辺りの件数と+フラグが"1"の件数を同時に取得するSQL分はかけますでしょうか? 別々ならば、 SELECT DATE,TIME,COUNT(*) AS KENSU1 FROM W_TABLE GROUP BY DATE,TIME ORDER BY DATE,TIME と SELECT DATE,TIME,COUNT(*) AS KENSU2 FROM W_TABLE WHERE FLG="1" GROUP BY DATE,TIME ORDER BY DATE,TIME でかけると思うのですが、 1個のSQL分で記述は可能でしょうか? 処理結果を 05/02/23 12:00 10 5 05/02/24 10:00 12 3 (日付・時間・件数・フラグ="1"の件数 見たいに取得したいのですが..
- ベストアンサー
- Oracle
- count(*)のcountをとりたい
現在、以下のようなテーブルを扱っているのですが、 +---------+ |accountid| +---------+ | 999| | 999| | 638| | 638| | 638| | 999| | 999| | 638| +---------+ を、ユニークな件数でとろうとしています。 現在は > select count(*) from TABLE group by accountid; +----------+ | count(*)| +----------+ | 4| | 4| +----------+ 2 rows in set (0.00 sec) などとして、「2 rows in set」を読むと言う方法なのですが、それだと人の手を介さないといけないのでどうにか出力結果をダイレクトに取得したいのです。 SQLサーバで使えるらしい select count(*) from (select count(*) from TABLE group by accountid) as AA; と言うSQL文を使っても無理だったので、どなたか方法をご存じないでしょうか???
- ベストアンサー
- MySQL
- アクセス:クロス集計の抽出条件-2
質問No.9247365 で類似した質問をしました。 添付のようなテーブルがあり下記のSQLを実行するとクエリ1になるのですが、カウントに抽出条件を入れてクエリ3のように合計件数が1のものは集計しないようしたいと思います。 下記SQLをどのように直したらよいでしょうか。一つのクエリで行う方法を教えて下さい。 TRANSFORM Count([テーブル1].[くだもの]) AS くだもののカウント SELECT [テーブル1].[くだもの], Count([テーブル1].個数) AS 合計 FROM テーブル1 GROUP BY [テーブル1].[くだもの] PIVOT [テーブル1].月;
- ベストアンサー
- オフィス系ソフト
- 月間集計ですべての日付を抽出するには
Oracle9iで開発をしております。 月間集計をするにあたり、SQLをどのように書けばよいのか質問させていただきたいと思います。 たとえば、COUNTテーブルというテーブルがあり 年月日 カウント数 2005/09/01 1000 2005/09/01 1000 2005/09/02 2000 2005/09/03 3000 2005/09/05 5000 2005/09/06 6000 というようにデータが入っていたとします。 現在、 SELECT 年月日, SUM(カウント数) FROM COUNTテーブル WHERE COUNT_DATE BETWEEN TO_DATE(to_char(?||'/'||?||'/01')) AND LAST_DAY(TO_DATE(to_char(?||'/'||?||'/01'))) GROUP BY 年月日 としていまして、抽出されるデータは 2005/09/01 2000 2005/09/02 2000 2005/09/03 3000 2005/09/05 5000 2005/09/06 6000 となります。 ここで、2004/09/04や2005/09/07以降2005/09/30までのテーブルには存在 しない日付も抽出したいと思っています。 どのようにすれば抽出できるのでしょうか?
- ベストアンサー
- Oracle
- コマンドプロンプト 複数の実行結果を変数に
複数のテーブルのデータ件数を取得して変数に入れ、result.txtに結果を出力したいのですが、下のように書くと、1つのテーブルのデータ件数しか出力されません。複数の結果を出力するにはどうしたらよいか教えてください。 for /f %%z in ('mysql -u root -p ^< "c:\bat\test.sql"') do set count=%%z echo result: %count% >> "c:\bat\result.txt" test.sqlの中身を、 select count(*) from table1; select count(*) from table2; select count(*) from table3; とすると何も出力されず、 select count(*) from table1; とすると、1つの結果だけ出力されます。
- ベストアンサー
- MySQL
お礼
申し訳ありません。バージョンは4.020です。 お教えいただいたのを参考にし、できました。 ありがとうございました。