今だけ人気マンガ100円レンタル特集♪

日数の平均を取得したいのですが、小数点の値が戻ってきません。どうしてでしょうか?

select avg(datediff(y,A_date,B_date))
from TABLE

●欲しいデータ
1.5 = 3(日間) ÷ 2(レコード)
●データ内容
SQL> select A_date,B_date from TABLE;
A_date,B_date
----------
2005/07/01 2005/07/02
2005/07/01 2005/07/03

このQ&Aに関連する最新のQ&A

平均 SQL」に関するQ&A: SQL2005 調和平均

A 回答 (1件)

整数にavgを適用すると整数で返すからです。


avgの対象を浮動小数点数に変換しておけば浮動小数点数で値が返ります。


select a from test
select avg(a) from test
select avg(a+0.0) from test
【結果】
a
-----------
1
1
1
1
2


-----------
1


------------------------------------------
1.200000

ということです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
出来ました!
浮動小数点にするってことが出来るのですね。

お礼日時:2005/07/27 21:36

このQ&Aに関連する人気のQ&A

平均 SQL」に関するQ&A: Oracleのテーブルサイズ

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q平均値を求めるSQL文を教えてください。

customerID,userID,CategoryID
0     24   01
0     24   04
0     24   07
0     25   01
0     25   02
1     1   01
1     1   04
1     24   01

上記のような構成のテーブルがありcustomerIDとuserIDを合わせて個人が特定出来るようになっています
CategoryIDのユーザー1人あたり平均チェック数を出したい場合どのようなクエリで問い合わせればよいでしょうか?

Aベストアンサー

平均チェック数がCategoryIDの平均だと仮定すると、

select customerID,userID,avg(CategoryID)
from テーブル
group by customerID,userID

なんて単純ではないですかね?

Qわり算の結果が整数でも小数点以下4桁まで表示されてしまう!

わり算の結果が整数でも小数点以下4桁まで表示されてしまう!

同じような質問で恐縮なのですが、
例えば、100、101というデータをMySQLの算術演算子/を使って2で割ると、
50.0000、50.5000のように、整数だろうが小数だろうが、小数点以下4桁まで出てしまいます。
これを、いろんな関数を駆使して50、50.5にすることはできますか。
50、51または50.0、50.5のように小数点の位置を同じずつ動かすことはできるのですが、これでは嫌だなぁと思った次第です

Aベストアンサー

いまさらだけどちょっと思いついたので・・・
テンポラリテーブルに一度格納してから表示してみては?

CREATE TEMPORARY TABLE TEMP(STR VARCHAR(100),NUM DOUBLE);
INSERT INTO TEMP SELECT '100/2',100/2;
INSERT INTO TEMP SELECT '101/2',101/2;
SELECT * FROM TEMP;

QMS SQLServer のSQLで文字列の前にN:

MS SQLServer のSQLで文字列の前にN: をつけることをよく見かけますが、
「N:」とはいったいどんな意味なのでしょうか?
教えて下さい。

Aベストアンサー

T-SQLでの話かと思いますが・・・。NCHAR/NVARCHAR型という、型(タイプ)があるのですが、これらは、夫々、national character/national character varying(SQL-92での表記法)の意味を持っています。夫々、固定長文字列(Unicode)/可変長文字列(Unicode)です。
NVARCHARはSQL-Server2000では4000文字まで、VARCHAR2は8000文字まで格納可です。(つまり、1/2になるということです)

さて、N'***' とT-SQL内で書くと、''内の文字をUnicodeで表現されたものとして処理する、という意味になります。Nは、nationalの略です。ですから、日本語を使おうとするとNは必須になる、という事ですね。

こんな感じでつかいます。#N'Unicode 文字列'

QSQL 特定のカラムが最大値のレコード取得

初心者です。SQL文で困っています。
どなたかご教授頂けたらと思います。

環境は、SQL SERVER 2000です。
特定のカラムが最大値のレコードのみ取得したいです。
たとえば、以下のようなデータがあるとします。
コード、履歴番号で主キーとします。
コード|履歴番号 |金額
0001 |1 |12000
0001 |2 |12001
0001 |3 |12002
0002 |1 |12000
0002 |2 |12001
0002 |3 |12002
0003 |1 |12000
0003 |2 |12001
この場合に、コード毎に履歴番号が最大のレコードのみを取得したいです。
理想の結果は以下になります。
コード|履歴番号 |金額
0001 |3 |12002
0002 |3 |12002
0003 |2 |12001

以上です。よろしくお願いいたします。

Aベストアンサー

SQL Server 2000で動くかどうか分かりませんが、SQL例です。

select *
from t1 as x
where 履歴番号=(select max(履歴番号)
from t1
where コード=x.コード)
order by コード

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

QSQL Server時間切れについて

初めまして。SQL初心者です。
あるシステムにおいて、SQLサーバが無応答?になり、システムがダウンしてしまい、困っています。

Windows2000Server、SQL Server2000、VB6を用いてDBに定期的にRead&Write、及び各種のデータ表示を行っています。
ADOを使用して、接続や各コマンドを実行しているのですが、ごくたまに以下のエラーが出てしまいます。
Code:-2147217871,Description:時間切れになりました。Source:Microsoft OLE DB Provider for SQL Server,SQL State:HYT00,NativeError:0
過去ログや他サイトを調べた結果、コネクションのCommandTimeoutの秒数を延長させる、とあったので60秒に変更しました。
が、不定期(大体1週間~10日前後で夜中や朝方などにもあり)にこのエラーが出てしまい、約1時間~1時間半もダウンしています(この間のエラーをOn Errorではじいてログファイルに保存しています)。
毎分必ず実行しているストアド(20装置分のデータをUPDATEするので1分に20回実行する)があるのですが、必ずと言っていいほどこのストアド実行中に落ちています。
このストアドに5~6個のパラメータを渡し、複数のテーブルに対してUPDATE処理を行っています。
正常に動作している時は、数日間全く問題無いので、ストアドやVBのコードに間違いは無いと思います。

そこで、SQL Serverの設定等を見直したところ、1つ気になったところが。データベースファイル
\Microsoft SQL Server\MSSQL\Data\aaa.MDF
のサイズが14Gになっていました・・・。
このファイルにアクセスする時にSQL Serverで高負荷になってしまい、無応答のような状態になってしまうのでは?と思っていますがどうでしょう?

不定期に発生し、かつ再現性が無く、原因が掴めずに本当に困っています。
先輩方、何でも良いのでアドバイスをお願い致します。

初めまして。SQL初心者です。
あるシステムにおいて、SQLサーバが無応答?になり、システムがダウンしてしまい、困っています。

Windows2000Server、SQL Server2000、VB6を用いてDBに定期的にRead&Write、及び各種のデータ表示を行っています。
ADOを使用して、接続や各コマンドを実行しているのですが、ごくたまに以下のエラーが出てしまいます。
Code:-2147217871,Description:時間切れになりました。Source:Microsoft OLE DB Provider for SQL Server,SQL State:HYT00,NativeError:0
過去ログや他サイ...続きを読む

Aベストアンサー

14Gですか・・・大きいですね。
データの構造がどうなのか解らないので、
容量的に妥当かどうかはわかりませんが、
一度インデックスの再構築と圧縮を掛けてはどうでしょうか


CREATE PROCEDURE SP_COMPRESS AS

DECLARE @name varchar(30)

DECLARE tnames_cursor CURSOR FOR
SELECT name FROM sysobjects
WHERE type = 'U'
OPEN tnames_cursor

FETCH NEXT FROM tnames_cursor INTO @name
WHILE (@@fetch_status <> -1)
BEGIN
PRINT @name + 'のDBREINDEX...'
EXEC ('DBCC DBREINDEX ('+ @name + ')' )
FETCH NEXT FROM tnames_cursor INTO @name
END
DEALLOCATE tnames_cursor

dbcc SHRINKFILE("SampleDb_Log",1)
DBCC SHRINKDATABASE("SampleDb",1)
GO


データベース名は自分の環境に合わせてください。
また、バックアップは必ず取っておいてください。
14Gもあれば結構時間がかかると思いますが・・・

とりあえず参考程度に・・・

14Gですか・・・大きいですね。
データの構造がどうなのか解らないので、
容量的に妥当かどうかはわかりませんが、
一度インデックスの再構築と圧縮を掛けてはどうでしょうか


CREATE PROCEDURE SP_COMPRESS AS

DECLARE @name varchar(30)

DECLARE tnames_cursor CURSOR FOR
SELECT name FROM sysobjects
WHERE type = 'U'
OPEN tnames_cursor

FETCH NEXT FROM tnames_cursor INTO @name
WHILE (@@fetch_status <> -1)
BEGIN
PRINT @name + 'のDBREINDEX...'
EXEC ('DBCC DBREINDEX (...続きを読む

QSELECT 文 GROUP での1件目を取得

非常に初歩的な事で恐縮ですが、
以下のデータを抽出するsql文の書き方を模索しています。
環境:SQLSERVER2005

| 列1| 列2 |
+---+---+
| 1 | A |
| 1 | B |
| 1 | C |
| 1 | D |
| 2 | F |
| 2 | G |
| 2 | H |
| 3 | X |
| 3 | Y |
| 3 | Z |

上記のテーブルがあるとします。
列1でグループした値で、1レコード目の列2を抽出したいのです。
出力結果としては、

列1列2
+--+--+
1,A
2,F
C,X

としたいのです。
列1でGROUPしてしまうと列2の内容を集約しないといけないので困っています。
ご教授いたけないでしょうか?

Aベストアンサー

SQL Server 2005では、Oracleでいう分析関数が実装されています。

select
列名1,
列名2
from
(select
rank() over(partition by 列1 order by 列2) as rk,
列1,列2
from 表名) as x
where rk=1

Q複数列の最大値を求めたい

SQLServerでOracleのGREATEST関数のような事がしたいです。

具体的に書きますと、

ID | 列1 | 列2 | 列3 | 列4 | 列5
------------------------------
01 | 700 | 200 | 300 | 400 | 100
02 | 100 | 800 | 200 | 300 | 200
03 | 100 | 300 | 900 | 100 | 100

という表があった場合に

ID | 最大値
------------------------------
01 | 700
02 | 800
03 | 900

といった結果を求めたいです。

CASE等を利用するしか方法はないのでしょうか。

Aベストアンサー

SELECT ID,MAX(列) AS 最大値 FROM
(SELECT ID,列1 AS 列 FROM テーブル
UNION ALL SELECT ID,列2 AS 列 FROM テーブル
UNION ALL SELECT ID,列3 AS 列 FROM テーブル
UNION ALL SELECT ID,列4 AS 列 FROM テーブル
UNION ALL SELECT ID,列5 AS 列 FROM テーブル) AS TBL
GROUP BY ID ORDER BY 1
でどうでしょうか。

Q日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。


人気Q&Aランキング