質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

9655閲覧

SQLで、期間を区切り、その区間での平均値を出す

退会済みユーザー

退会済みユーザー

総合スコア0

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

1グッド

1クリップ

投稿2016/05/05 13:25

編集2016/05/07 02:29

SQLの練習で、期間を区切り、その区間での平均値を出すということができません。

リンク先のデータベースを借りました。
データベース
http://dokoql.com/d/app.html
テーブル:家計簿アーカイブ

区間A:2012-12-18~2012-12-25
区間B:2013-01-13~2013-01-25
として、区間A、区間Bの出金額の平均値を出したい、というものです。

表示したい形↓


日付 出金額
区間A 29733
区間B 28933


それぞれの日付で、区間A、区間A、区間A、区間B、区間B、区間Bというふうに出てきてどうしてもうまくいきませんでした。

以下が自分でやってみてダメだったもの
select
case
when '2012-12-18' < 日付 AND '2012-12-25' > 日付 then '区間A'
when '2013-01-13' < 日付 AND '2013-01-25' > 日付 then '区間B'
end,
round(avg(出金額),0)
FROM 家計簿アーカイブ
group by 日付

よろしくお願いいたします。

A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/05/05 14:12

「やってほしいことだけを記載した丸投げの質問」という指摘を受けましたので実際に私がやったSQL文を以下に記載いたします。 ここの練習だけでGWを使い果たし、質問させていただいたことをご理解ください。 ++++++++++++++ select case when '2012-12-18' < 日付 AND '2012-12-25' > 日付 then '区間A' when '2013-01-13' < 日付 AND '2013-01-25' > 日付 then '区間B' end, round(avg(出金額),0) FROM 家計簿アーカイブ group by 日付
kaputaros

2016/05/06 01:54

本文が修正できますので、そちらに追記としてSQLを書いたほうがよいかと。 こちらでは、かなーり見づらいです。
guest

回答3

0

ベストアンサー

区間Aのみですが、

sql

1SELECT 2 '区間A' AS 日付 3 , ROUND(AVG(出金額)) 4FROM 5 家計簿アーカイブ 6WHERE 7 日付 BETWEEN '2012-12-18' AND '2012-12-25'

ご提示のサイトにあるアプリケーションで検証済みです。
(一部のSQLでは必ず大文字で指定する必要があるようです)

投稿2016/05/05 13:42

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/05/05 14:26

ご回答ありがとうございます。 区間Bも表示するために下記のように打ち込んだのですが、 **************** SELECT '区間A' AS 日付 , ROUND(AVG(出金額)), '区間B' AS 日付 , ROUND(AVG(出金額)) FROM 家計簿アーカイブ WHERE 日付 BETWEEN '2012-12-18' AND '2012-12-25', 日付 BETWEEN '2013-01-13' AND '2013-01-25' ************************* エラーになってしまいます。 なぜでしょうか。
A-pZ

2016/05/05 14:32

WHERE句の指定方法に誤りがあります。 どちらかというと、区間Aと区間Bの結果をそれぞれ出して、UNION ALL で結合したほうが良いでしょう。
退会済みユーザー

退会済みユーザー

2016/05/07 02:21

ありがとうございました。 union allで解決しました。
guest

0

こんなのはどうでしょう?

前準備として区間テーブルを作成します。

区間テーブル
区間名 自 至

区間A 2012-12-18 2012-12-25
区間B 2013-01-13 2013-01-25

SQLは、
SELECT s.区間名, ROUND(AVG(出金額),0) AS 出金額平均
FROM 家計簿アーカイブ AS h
INNER JOIN 区間テーブル AS s
ON h.日付 BETWEEN s.自 AND s.至
GROUP BY s.区間名

投稿2016/05/06 03:13

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/05/07 02:22

回答ありがとうございます。 別テーブルを作って結合という方法もあるんですね。
guest

0

これって、1回あたりの出金額の平均を月ごとに求めたいって事ではないでしょうかね。

ポイント1:出金額が0超過のレコードのみ抽出する。
ポイント2:関数を使って「月ごと」を表現する列をつくる
ポイント3:「月ごと」の列でグループ化する
ポイント4:関数を使って平均額を表現する列を作る。

select 月ごと, round(avg(出金額),0) from ( SELECT TO_CHAR(日付,'YYYY年MM月') as 月ごと, 出金額 FROM 家計簿アーカイブ where 出金額 > 0 ) as T group by 月ごと order by 月ごと

投稿2016/05/05 14:24

編集2016/05/05 14:40
TetsujiMiwa

総合スコア1124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/05/05 14:29

ご回答ありがとうございます。 これは、どちらかというと自分で作った問題(課題)です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問