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

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

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

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

2回答

437閲覧

2つのSELECT文をまとめたい

TAKE_SS

総合スコア40

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2022/07/13 01:53

編集2022/07/13 02:46

以下のデータに対して、データの数と、データが0でないものの平均を1度にまとめて取得できないかと考えています

DATA
+-------+-------+--------+
| EmpID | Kubun | KAKAKU |
+-------+--------+--------+
| A001 |   1 |    0 |
| A002 |   2 |  100 |
| A003 |   1 |  200 |
| A004 |   1 |  300 |
+-------+--------+--------+

実現したいこと

以下のデータをカウント及び集計したい
1.登録されているデータ数
2.価格が入っているデータ数
3.価格が入っているデータの平均
4.価格が入っているデータの最大
5.価格が入っているデータの最小

項番1と項番2は以下で取得可能を確認

SELECT Kubun, COUNT(*) NUM1, COUNT(CASE WHEN KAKAKU>0 THEN 1 ELSE NULL END) NUM2 FROM DATA GROUP Kubun

項番3は以下で取得可能を確認

SELECT Kubun, ROUND(AVG((KAKAKU)*10),-1)/10 AVGP, MAX(KAKAKU), MIN(KAKAKU) FROM DATA WHERE KAKAKU>0 GROUP GROUP Kubun

知っていれば簡単にできる物なのかもしれないのですが、知識が足りず、検索のキーも良い物がヒット出来ずにいます。

2回のSELECT文にすれば出来るのですが、まとめて1つのデータとして取得したいのです。よい方法はないでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

SQL Serverでは未検証なのでだめかもしれませんが

SQL

1select kubun,avg(case kakaku when 0 then null else kakaku end) as avg 2from data 3group by kubun

投稿2022/07/13 02:22

yambejp

総合スコア114843

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

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

TAKE_SS

2022/07/13 02:58

回答ありがとうございます ここにもcase分を入れて対象外はnullにすれば良いのですね。 勉強になりました 最小値なども同様にcase文を入れれば出来そうです。 ありがとうございました ```SQL select kubun,avg(case when kakaku=0 then null else kakaku end) as avg from data group by kubun ```
yambejp

2022/07/13 03:03 編集

価格が抜けてる=0円は最初から無理があります。 nullの可能性があるならデータにnullを許容するという手も検討する必要があるかもしれません もしくは価格を0円として、データ抜けかどうかをフラグとして保存する別カラムを用意するとか・・・
TAKE_SS

2022/07/13 03:17

そうですね.null許容にしておいて初期値nullにする事も合わせて検討し、調整してみます。 回答ありがとうございます
guest

0

条件付きの平均ですから、単純なAVG()では算出できませんね。
平均=総数/個数
という式に立ち返るのが、最も単純です。

SQL

1SELECT *, ROUND(TOTAL_KAKAKU / NUM2,-1)/10 AVGP 2FROM ( 3 SELECT ubun 4 , COUNT(*) NUM1 5 , COUNT(CASE WHEN KAKAKU>0 THEN 1 ELSE NULL END) NUM2 6 , SUM((KAKAKU)*10) TOTAL_KAKAKU 7 FROM DATA GROUP BY Kubun 8) t

投稿2022/07/13 02:11

sazi

総合スコア25195

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

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

TAKE_SS

2022/07/13 02:22

回答ありがとうございます 平均を別で計算すれば良いのですね。勉強になりました ついでにもう一つ(わかれば)教えてください 平均だけなら計算できますが、価格の最大と最小( MAX(KAKAKU) MAXP, MIN(KAKAKU) MINP )も欲しいとなった場合は1回では取得できないのでしょうか (最初からやりたいことに書いて無くてすいません)
TAKE_SS

2022/07/13 02:58

case文を入れることで対応出来そうです。 回答ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問