🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQL Server

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

SQL

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

Q&A

解決済

1回答

843閲覧

[SQL Server]AVG関数について

WBD212

総合スコア5

SQL Server

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

SQL

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

0グッド

0クリップ

投稿2021/01/13 08:19

環境

Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Standard Edition (64-bit) on Windows Server 2019 Essentials 10.0 <X64> (Build 17763: )

前提

DBに登録されている数値の平均値を取得するためにAVG関数を用いたところ、
思わぬ結果が出ました。
AVG関数の仕様を調べるため下記コードを作成したところ

SQL

1select AVG(val) result 2from ( 3 select CONVERT(decimal,'23') val 4 union all 5 select CONVERT(decimal,'22.5') val 6) as test

予想は「22.75」となるつもりでしたが結果は「23.000000」となります。
試しに下記コードを試したところ

SQL

1select AVG(val) result 2from ( 3 select CONVERT(float,'23') val 4 union all 5 select CONVERT(float,'22.5') val 6) as test

予想通り「22.75」と結果が出ます。

疑問

①Floatは小数を2進数で取扱ため厳密な計算は出来ないが、Decimalは小数も10進数で計算されるため、
より厳密な計算をされるという認識なのですが誤っているのでしょうか?

②Decimal型を用いた時にどういった計算(丸めが原因?)で結果が「23.000000」となるのでしょうか?

備考

数値が文字型なのはテーブル定義は他者が行っており、
どういうわけかわかりませんが、列の型がNvarcharで定義されているため、
テーブル定義に合わせてテスト用SQLを作成しております。

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

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

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

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

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

WBD212

2021/01/13 08:34

Convert時に有効桁数の指定を行わなければいけないのですね。 下記内容に変更すると想定通りの値を取得することが出来ました。 ありがとうございます。 select AVG(val) result from ( select CONVERT(decimal(5,2),'23') val union all select CONVERT(decimal(5,2),'22.5') val ) as test
m.ts10806

2021/01/13 08:41

困ったときはドキュメントで機能確認ですね。
guest

回答1

0

自己解決

ご指摘により、Convert時の桁数指定が必要なことに気づきました。

■修正前

SQL

1select CONVERT(decimal,'23')

■修正後

SQL

1select CONVERT(decimal(5,2),'23')

投稿2021/01/13 08:37

WBD212

総合スコア5

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問