SQL Server 文字列を日付型に変換する: CONVERT, CAST

SQL Server 文字列を日付型に変換する: CONVERT, CAST

SQL Serverで文字列を日付型に変換するには CONVERT, CAST を使います。
逆に日付型から文字列にする場合にも CONVERT を使います。
SQL Server 日付の年月日だけを取り出す: CONVERT

CONVERT や CAST は、あるデータ型の式を別のデータ型の式に変換できる非常に便利な関数です。

CAST

CASTを使った変換です。

select 'CAST(''02/27/2018'' AS datetime)' as 式, CAST('02/27/2018' AS datetime) as 結果
union all
select 'CAST(''180227'' AS datetime)', CAST('180227' AS datetime)
union all
select 'CAST(''18/02/27'' AS datetime)', CAST('18/02/27' AS datetime)
union all
select 'CAST(''18/02/27 07:08:09'' AS datetime)', CAST('18/02/27 07:08:09' AS datetime)
union all
select 'CAST(''20180227'' AS datetime)', CAST('20180227' AS datetime)
union all
select 'CAST(''2018/02/27'' AS datetime)', CAST('2018/02/27' AS datetime)
union all
select 'CAST(''2018/02/27 07:08:09'' AS datetime)', CAST('2018/02/27 07:08:09' AS datetime)

結果は、以下の通りです。

SQL Server CASTを使った文字列⇒日付型変換

SQL Server CASTを使った文字列⇒日付型変換

CONVERT

CONVERTを使った変換です。(CASTと変わりませんが。。。)

select 'CONVERT(datetime, ''02/27/2018'')' as 式, CONVERT(datetime, '02/27/2018') as 結果
union all
select 'CONVERT(datetime, ''180227'')', CONVERT(datetime, '180227')
union all
select 'CONVERT(datetime, ''18/02/27'')', CONVERT(datetime, '18/02/27')
union all
select 'CONVERT(datetime, ''18/02/27 07:08:09'')', CONVERT(datetime, '18/02/27 07:08:09')
union all
select 'CONVERT(datetime, ''20180227'')', CONVERT(datetime, '20180227')
union all
select 'CONVERT(datetime, ''2018/02/27'')', CONVERT(datetime, '2018/02/27')
union all
select 'CONVERT(datetime, ''2018/02/27 07:08:09'')', CONVERT(datetime, '2018/02/27 07:08:09')

結果は、以下の通りです。

SQL Server CONVERTを使った文字列⇒日付型変換

SQL Server CONVERTを使った文字列⇒日付型変換

引数の文字列表記

CONVERT も CAST も、引数にいろいろな形式で文字列を与えることができます。
これは使用する言語によってエラーになってしまう場合もあります。

使っているSql Server の設定言語に合わせて引数の文字列を渡すか、SET DATEFORMAT を使ってそのセッションの日付フォーマットを変えるかすると安心です。
基本的に日本のサーバーであれば日本語が使用言語になっていると思いますが、私は格安のアメリカのレンタルサーバーを使うこともあるため、SET DATEFORMAT を使っています。

日本は「年月日」で表記しますが

日本は「年月日」で表記しますが、アメリカは「月日年」、ヨーロッパは「日月年」となります。
セッションの言語によって、datetime の形式とシステム メッセージが決められているので、注意しましょう。

以上、「SQL Server 文字列を日付型に変換する: CONVERT, CAST」の備忘録でした。

SQL Server 言語確認

SQL Server 言語確認

SQL Server は、使用している言語に対応してメッセージなどを表示します。
言語環境が異なるといろいろ戸惑うこと、とくに日付の表記の違いとか、があるので注意が必要です。

SQL Server 使用言語の調べ方

以下のSQLで調べることができます。

select name from syslanguages where langid=(select value from sys.configurations where name='default language')

ただし、デフォルトの言語を知ることができるのみで、セッションで設定された言語は表示されません。
セッションで設定した言語の調べ方は、私も知りません。知ってたらコメントで教えてください。

エラーメッセージ

エラーメッセージの言語も設定した言語に変わります。
言語を変えて以下のようにエラーを発生させてみます。


SET LANGUAGE japanese;
GO
test
GO

SET LANGUAGE us_english;
GO
test
GO

SET LANGUAGE Italian;
GO
test

結果は、以下のようになります。

SQL Server 使用言語の違い エラー表示

SQL Server 使用言語の違い エラー表示

「メッセージ 2812、レベル 16、状態 62、行 3」のエラー情報が日本語のままですが、「ストアド プロシージャ ‘test’ が見つかりませんでした。」はちゃんと変更されてますね。

その他の関連表記

この他にも使用言語は、以下の表記にも関係してきます。
dateformat : 日付要素の順序を指定します。 有効なパラメーターはmdy、 dmy、 ymd、 ydm、 myd、およびdym。
datefirst : 週の最初の曜日を指定します。 設定が 7 なら日曜日です。
months : 言語に合わせた月名を表示。
shortmonths : 言語に合わせた短い月名を表示。
days : 言語に合わせた曜日を表示。

この言語設定に関する情報は syslanguages を参照すると見ることができます。

select * from syslanguages
SQL Server 使用言語設定表

SQL Server 使用言語設定表

この他にもまだ言語に影響される表記もありますが、とりあえずこの辺で。
以上、「SQL Server 使用言語を調べる」でした。

SQL Server 現在日時を取得する: GETDATE, SYSDATETIME

SQL Server 現在日時を取得する: GETDATE

SQL Server で、現在の日付・時刻を取得したい場合は、以下の関数で取得します。

GETDATE(). SYSDATETIME(), CURRENT_TIMESTAMP

現在のUTCの日時を取得したい場合は、以下の関数で取得します。
GETUTCDATE(), SYSUTCDATETIME()

タイム ゾーン オフセットが含まれる日時を知りたい場合は、以下の関数で取得します。
SYSDATETIMEOFFSET()

ちなみに、現在の日時と言っても実際には、SQL Servar が動いているサーバーのシステム日時を取得します。

GETDATE(). SYSDATETIME(), CURRENT_TIMESTAMP

各々、現在のデータベース システムのタイムスタンプを返します。
しかし、1 秒未満の有効桁数で比較すると、SYSDATETIME の方が GETDATE よりも高い精度を得ることができます。


select SYSDATETIME() as SYSDATETIME
, GETDATE() as GETDATE
, CURRENT_TIMESTAMP as [CURRENT_TIMESTAMP]

GETDATE(). SYSDATETIME(), CURRENT_TIMESTAMPの取得結果画面

GETDATE(). SYSDATETIME(), CURRENT_TIMESTAMPの取得結果画面

GETUTCDATE(), SYSUTCDATETIME()

各々、現在のデータベース システムのUTCのタイムスタンプを返します。
しかし、1 秒未満の有効桁数で比較すると、SYSUTCDATETIME の方が GETUTCDATE よりも高い精度を得ることができます。


select SYSUTCDATETIME() as SYSUTCDATETIME
, GETUTCDATE() as GETUTCDATE

GETUTCDATE(), SYSUTCDATETIME()の取得結果画面

GETUTCDATE(), SYSUTCDATETIME()の取得結果画面

SYSDATETIMEOFFSET()

SQL Server のインスタンスを実行しているコンピューターの日付と時刻を含む タイム ゾーン オフセットが含まれる 値を返します。


select SYSDATETIMEOFFSET() as SYSDATETIMEOFFSET

SYSDATETIMEOFFSET()の取得結果画面

SYSDATETIMEOFFSET()の取得結果画面

誤差について

SQL Server は、GetSystemTimeAsFileTime() Windows API を使用して日付と時刻の値を取得しています。
精度は、SQL Server のインスタンスが実行されているコンピューター ハードウェアおよび Windows のバージョンによって異なります。
この API の精度は 100 ナノ秒で固定されます。
精度は、GetSystemTimeAdjustment() Windows API を使用して確認できます。

以上、「SQL Server 現在日時を取得する: GETDATE, SYSDATETIME」の紹介でした。

SQL Server 2017 Express エディション のインストール

SQL Server 2017 Express エディション のインストール

Microsoft SQL Server Express は Microsoft SQL Server の無償で提供されているエディションです。
Express は、エントリ レベルのデータベースで、最大 10 GB サイズの小規模なデータ ドリブン Web アプリケーションとモバイル アプリケーションを構築できます。

コアの最大数 4 コアです。PCでテスト環境に使うには十分かと思います。
使用できるメモリは、
インスタンスあたりの最大バッファー プール サイズで、1410 MB
インスタンスあたりの最大 Columnstore セグメント キャッシュ サイズは、352MB
データベースあたりの最大メモリ最適化データ容量は、352MB
最大データベース サイズは、10GB

となっています。
こう書かれても、私もピンと来ませんが、1つのトランザクションでそれほど大きなデータ処理をしなければ、全く問題のない機能だと思います。
もし、相当に大きなデータ処理をしたいのなら、「SQL Server 2017 Developer」を入れないといけないと思います。

SQL Server 2017 Express エディション のインストールの手順は、
1)SQL Server 2017 Express のダウンロード
2)SQL Server 2017 Express のインストール

SQL Server 2017 Express のダウンロード

下のリンク先から SQL Server 2017 Express のダウンロードを行います。
SQL Server ダウンロード

SQL Server ダウンロード

SQL Server ダウンロード

ダウンロードすると、「SQLServer2017-SSEI-Expr.exe」ファイルを入手できます。

SQL Server 2017 Express のインストール

上で入手した SQLServer2017-SSEI-Expr.exe を実行します。
インストールの準備が終わると、下のような画面が表示されます。
基本(B)をクリックします。
カスタマイズを行いたい場合は、カスタム(C)をクリックしますが、SQL Server に詳しくない場合は基本(B)を選択しましょう。

SQL Server インストール開始画面

SQL Server インストール開始画面

基本(B)をクリックすると「マイクロソフト ソフトウェア ライセンス条項」の同意画面が表示されます。
同意しましょう。

次に、SQL Server インストール場所の指定画面が表示されます。
標準ではCドライブにインストールされます。ドライブを変更したい場合は変更しておきましょう。
ここではSQL Server のプログラムのインストール先の指定なので、データの入れ先は別途後からになります。

あと、空き容量の確認をしておきましょう。
問題がなければ、「インストール(I)」ボタンをクリックしてSQL Server Express の本体のダウンロード&インストールを行います。

SQL Server インストール場所の指定

SQL Server インストール場所の指定

ダウンロード中は下のような画面が表示されています。
ダウンロードはかなりのスピードで行われるので、そんなに時間も掛からないと思います。

SQL Server インストール中の画面

SQL Server インストール中の画面

ダウンロードに成功すると下のような画面が表示されます。

SQL Server ダウンロード成功

SQL Server ダウンロード成功

ダウンロードが成功して、しばらくすると、インストールに入ります。
HDD の環境次第ですが、ダウンロードより少し時間がかかると思います。

SQL Server インストール中

SQL Server インストール中

インストールが成功すると下のような画面が表示されます。
SSMS(SQL Server Management Studio)はよく使うので、「SSMS インストール(I)」をクリックしてインストールしておきましょう。
SQL Server Management Studio (SSMS) のダウンロード画面がブラウザに表示されます。

SQL Server インストール成功

SQL Server インストール成功

SQL Server Management Studio (SSMS) のダウンロード

SSMSのダウンロードを行います。
800Mを超える大きさなので少し時間が掛かります。
「SSMS-Setup-JPN.exe」ファイルがダウンロードされます。

SSMS ダウンロード

SSMS ダウンロード

SQL Server Management Studio (SSMS) のインストール

上でダウンロードした SMS-Setup-JPN.exe を実行します。
ちなみに、SQL Server Express のインストール画面が残っていると思います。SSMSが正常にダウンロードできたのなら閉じてください。

SSMS インストール開始

SSMS インストール開始

「パッケージを読み込んでいます」と言う準備が終わると下のような画面が表示されます。
完了までにしばらくかかります。

SSMS インストール中

SSMS インストール中

完了すると下のような画面が表示されます。

SSMS インストール完了

SSMS インストール完了

SSMS を起動する

早速、SSMS を起動してみましょう。
初回はユーザー設定の読み込みとかで少し時間が掛かるかもしれませんが、下のようなログイン画面が表示されます。

SSMS ログイン画面

SSMS ログイン画面

「接続」ボタンをクリックして接続しましょう。
SSMS の画面が正常に出ましたか?
SQL Server Express に正常に接続できましたか?

SSMS 画面

SSMS 画面

「新しいクエリー」ボタンをクリックして「クエリー」画面を表示しましょう。
そこで、下の SQL を発行して正常に戻ってこれば完了です。


select * from sys.sysobjects

SSMS sysobjects画面

SSMS sysobjects画面

正常に表示されていれば、これでインストール完了です。
お疲れさまでした。

SSMSとは

SSMS は、SQL Server から SQL Database まで、SQL インフラストラクチャを管理するための統合環境です。
SSMS には、SQL のインスタンスを構成、監視、および管理するためのツールが備わっています。
SSMS を使用して、アプリケーションで使われるデータ層コンポーネントを配置、監視、アップグレードしたり、クエリとスクリプトを作成したりすることもできます。

以上、「SQL Server 2017 Express エディション のインストール」の紹介でした。

SQL Server CHECKSUM_AGG チェックサム

CHECKSUM_AGG チェックサム

グループ内にある値のチェックサムが欲しい場合、CHECKSUM_AGG関数を使います。
どのようなケースでチェック
NULL 値は無視されます。

構文:CHECKSUM_AGG ( [ ALL | DISTINCT ] expression )
引数:ALL すべての値にこの集計関数を適用します。 ALL は既定値です。
   DISTINCT CHECKSUM_AGG で、一意な値のチェックサムを返します。
   expression 整数式です。 集計関数とサブクエリは使用できません。

CHECKSUM_AGG は、テーブル内の変更を検出する場合に使用できます。
テーブル内での行の順序は、CHECKSUM_AGG の結果に影響しません。

対象データを変更した場合は、そのリストのチェックサムも変わりますが、 計算の結果チェックサムが変わらない場合もあります。

CHECKSUM_AGG の AGG は、aggregate (集計)の意味です。

下のSQL例文を載せておきます。

declare @tbl1 table(c_point int)
insert into @tbl1 (c_point) values (30)
insert into @tbl1 (c_point) values (40)
insert into @tbl1 (c_point) values (4)
insert into @tbl1 (c_point) values (60)
insert into @tbl1 (c_point) values (60)
insert into @tbl1 (c_point) values (NULL)
insert into @tbl1 (c_point) values (80)

--ALL
--NULLはカウントされません
select CHECKSUM_AGG(c_point) from @tbl1

--DISTINCT
--60が重複しているので結果が異なります
select CHECKSUM_AGG(DISTINCT c_point) from @tbl1

--値が変更されると戻り値も変わります
update @tbl1 set c_point=70 where c_point=80
select CHECKSUM_AGG(c_point) from @tbl1

計算の結果チェックサムが変わらない例
下の例は非常に単純なので実際はこんなに簡単にチェックサムが変わらないことは無いと思いますが。
30 → 31 , 40 → 41 で同じ値を取ります。

declare @tbl1 table(c_point int)
insert into @tbl1 (c_point) values (30)
insert into @tbl1 (c_point) values (40)

--ALL
select CHECKSUM_AGG(c_point) from @tbl1

--値が変更されると戻り値も変わります
update @tbl1 set c_point=31 where c_point=30
update @tbl1 set c_point=41 where c_point=40
select CHECKSUM_AGG(c_point) from @tbl1

以上、SQL Server でチェックサムが欲しい場合、CHECKSUM_AGG関数を使い求めるでした。

SQL Server COUNT カウント 数える

COUNT カウント

SQL Server の対象データの行数を(アイテム数)求めるときに、COUNT関数もしくはCOUNT_BIG関数を使います。
COUNT は常に int データ型の値を返します。
COUNT_BIG は常に bigint データ型の値を返します。

構文:COUNT ( [ ALL | DISTINCT ] expression | * )
    OVER ( [ partition_by_clause ] order_by_clause )
引数:ALL すべての値に集計関数が適用されます。 ALL が既定値です。
   DISTINCT COUNT で、NULL でない一意な値の数を返します。
   expression text 、image、ntext 以外のあらゆる型の式です。
* すべての行を数えて、テーブル内の行の総数を返すことを指定します。
COUNT(*) はパラメーターはとらず、DISTINCT と一緒には使用できません。
COUNT(*) は重複値を除去しないで、指定されたテーブル内の行数を返します。
各行は 1 行としてカウントされ、 これには NULL 値を保持している行も含まれます。
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause は、FROM 句で生成された結果セットをパーティションに分割します。

下のSQL例文を載せておきます。

declare @tbl1 table(a_goods varchar(3), b_empNo char(1), c_point int)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','1',80)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','2',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','3',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','4',30)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','5',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','6',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','7',NULL)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','8',220)

--ALL
--NULLはカウントされません
select COUNT(ALL c_point) from @tbl1
select COUNT(c_point) from @tbl1 --ALLが無くても同じ結果

--COUNT_BIG
select COUNT_BIG(ALL c_point) from @tbl1

--DISTINCT
--60が重複しているので1つ減ります
select COUNT(DISTINCT c_point) from @tbl1

--*
--行がカウントされます
select COUNT(*) from @tbl1

--over
--a_goods毎にc_pointがカウントされます
select distinct a_goods, COUNT(c_point) OVER (PARTITION BY a_goods) from @tbl1

もう一例
AVG や SUM を共に使用して結果を求める

declare @tbl1 table(a_goods varchar(5), b_empNo char(1), c_point int)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','1',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','2',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','3',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','2',20)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','3',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','1',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','2',20)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','1',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','2',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','3',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','1',80)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','2',30)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','1',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','2',40)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','1',90)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','2',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','3',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','3',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','3',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','2',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','1',50)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','1',30)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','2',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','3',90)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','2',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','2',10)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','3',80)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','3',30)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','1',80)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','2',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','3',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','2',30)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','3',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','1',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','1',20)

--商品、社員ごとのデータ
select distinct a_goods, b_empNo
, COUNT(c_point) over (partition by a_goods,b_empNo) 個数
, SUM(c_point) over (partition by a_goods,b_empNo) 合計
, AVG(c_point) over (partition by a_goods,b_empNo) 平均 
from @tbl1

--社員ごとのデータ
select distinct b_empNo
, COUNT(c_point) over (partition by b_empNo) 個数
, SUM(c_point) over (partition by b_empNo) 合計
, AVG(c_point) over (partition by b_empNo) 平均 
from @tbl1


--商品、社員ごとのデータ
select a_goods, b_empNo
, COUNT(c_point) 個数
, SUM(c_point) 合計
, AVG(c_point) 平均
from @tbl1 group by a_goods, b_empNo order by a_goods, b_empNo

--社員ごとのデータ
select b_empNo
, COUNT(c_point) 個数
, SUM(c_point) 合計
, AVG(c_point) 平均
from @tbl1 group by b_empNo order by b_empNo

以上、SQL Server で COUNT関数を使いアイテム数や行数を求めるでした。

SQL Server MAX 最大

MAX 最大

SQL Server の対象データの最大値を求めるときに、MAX関数を使います。
数値型、日付型、文字列の最大値を求める事ができます。

構文:MAX ( [ ALL | DISTINCT ] expression )
引数:ALL すべての値に集計関数が適用されます。 ALL が既定値です。
   DISTINCT MAX では意味がなく、ISO との互換性を保つためだけに指定可能になっています。
   expression 定数、列、関数、および算術演算子、ビット演算子、文字列演算子の組み合わせを指定します。

下のSQL例文を載せておきます。

declare @tbl1 table(a_goods varchar(3), b_empNo char(1), c_point int)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','1',800000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','2',600000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','3',400000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','4',300000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','5',500000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','6',600000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','7',2200000)

--ALL
select MAX(ALL c_point) from @tbl1
select MAX(c_point) from @tbl1 --ALLが無くても同じ結果

--DISTINCT
--もともと一番大きい値を返すので意味がない
select MAX(DISTINCT c_point) from @tbl1

もう一例
over や group by 句で括って結果を求める

declare @tbl1 table(a_goods varchar(5), b_empNo char(1), c_point int)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','1',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','2',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','3',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','4',20)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','5',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','6',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','7',20)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','1',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','2',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','3',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','4',80)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','5',30)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','6',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','7',40)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','1',90)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','2',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','3',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','4',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','5',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','6',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','7',50)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','1',30)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','2',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','3',90)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','4',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','5',10)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','6',80)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','7',30)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','1',80)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','2',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','3',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','4',30)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','5',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','6',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','7',20)

select MAX(c_point) from @tbl1
select MAX(c_point) from @tbl1 where a_goods='001'
select MAX(c_point) from @tbl1 where a_goods='002'
select MAX(c_point) from @tbl1 where a_goods='003'
select MAX(c_point) from @tbl1 where a_goods='004'
select MAX(c_point) from @tbl1 where a_goods='005'
select a_goods, MAX(c_point) from @tbl1 group by a_goods  --商品の最大値

select distinct b_empNo, MAX(c_point) over (partition by b_empNo) from @tbl1  --社員の最大値 
select b_empNo, MAX(c_point) from @tbl1 group by b_empNo  --社員の最大値

以上、SQL Server で MAX関数を使い最大値を求めるでした。

SQL Server MIN 最小

MIN 最小値

SQL Server の対象データの最小値を求めるときに、MIN関数を使います。
数値型、日付型、文字列の最小値を求める事ができます。

構文:MIN ( [ ALL | DISTINCT ] expression )
引数:ALL すべての値に集計関数が適用されます。 ALL が既定値です。
   DISTINCT MIN では意味がなく、ISO との互換性を保つためだけに指定可能になっています。
   expression 定数、列、関数、および算術演算子、ビット演算子、文字列演算子の組み合わせを指定します。

下のSQL例文を載せておきます。

declare @tbl1 table(a_goods varchar(3), b_empNo char(1), c_point int)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','1',800000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','2',600000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','3',400000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','4',300000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','5',500000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','6',600000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','7',2200000)

--ALL
select MIN(ALL c_point) from @tbl1
select MIN(c_point) from @tbl1 --ALLが無くても同じ結果

--DISTINCT
--もともと一番小さい値を返すので意味がない
select MIN(DISTINCT c_point) from @tbl1

もう一例
over や group by 句で括って結果を求める

declare @tbl1 table(a_goods varchar(5), b_empNo char(1), c_point int)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','1',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','2',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','3',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','4',20)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','5',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','6',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','7',20)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','1',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','2',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','3',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','4',80)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','5',30)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','6',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','7',40)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','1',90)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','2',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','3',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','4',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','5',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','6',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','7',50)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','1',30)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','2',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','3',90)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','4',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','5',10)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','6',80)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','7',30)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','1',80)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','2',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','3',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','4',30)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','5',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','6',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','7',20)

select MIN(c_point) from @tbl1
select MIN(c_point) from @tbl1 where a_goods='001'
select MIN(c_point) from @tbl1 where a_goods='002'
select MIN(c_point) from @tbl1 where a_goods='003'
select MIN(c_point) from @tbl1 where a_goods='004'
select MIN(c_point) from @tbl1 where a_goods='005'
select a_goods, MIN(c_point) from @tbl1 group by a_goods  --商品の最小値

select distinct b_empNo, MIN(c_point) over (partition by b_empNo) from @tbl1  --社員の最小値 
select b_empNo, MIN(c_point) from @tbl1 group by b_empNo  --社員の最小値

以上、SQL Server で MIN関数を使い最小値を求めるでした。

SQL Server SUM 合計

SUM 合計

SQL Server の対象データの合計値の求めるときに、SUM関数を使います。

合計値はいろいろなデータ分析で使用されるので良く使う指標だと思います。

構文:SUM ( [ ALL | DISTINCT ] expression )
引数:ALL すべての値に集計関数が適用されます。 ALL が既定値です。
   DISTINCT 値の出現回数にかかわらず、一意な値の合計を返すことを指定します。
   expression 定数、列、関数、および算術演算子、ビット演算子、文字列演算子の組み合わせを指定します。
NULL 値はすべて無視されます。(対象データになりません)

下のSQL例文を載せておきます。

declare @tbl1 table(a_goods varchar(3), b_empNo char(1), c_point int)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','1',800000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','2',600000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','3',400000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','4',300000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','5',500000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','6',600000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','7',2200000)

--ALL
select SUM(ALL c_point) from @tbl1
select SUM(c_point) from @tbl1 --ALLが無くても同じ結果

--DISTINCT
--600000が2行あるため、重複を省き計算される
select SUM(DISTINCT c_point) from @tbl1

--expression
--型変換、桁あふれに対応する
delete from @tbl1
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','1',800000000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','2',600000000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','3',400000000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','4',300000000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','5',500000000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','6',600000000)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','7',1100000000)
select SUM(cast(c_point as bigint)) from @tbl1  --bigint型に
select SUM(cast(c_point as decimal(20,2))) from @tbl1  --decimal型に

もう一例
over や group by 句で括って結果を求める

declare @tbl1 table(a_goods varchar(5), b_empNo char(1), c_point int)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','1',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','2',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','3',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','4',20)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','5',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','6',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('001','7',20)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','1',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','2',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','3',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','4',80)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','5',30)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','6',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('002','7',40)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','1',90)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','2',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','3',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','4',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','5',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','6',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('003','7',50)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','1',30)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','2',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','3',90)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','4',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','5',70)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','6',80)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('004','7',30)

insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','1',80)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','2',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','3',40)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','4',30)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','5',50)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','6',60)
insert into @tbl1 (a_goods,b_empNo,c_point) values ('005','7',20)

select SUM(c_point) from @tbl1
select SUM(c_point) from @tbl1 where a_goods='001'
select SUM(c_point) from @tbl1 where a_goods='002'
select SUM(c_point) from @tbl1 where a_goods='003'
select SUM(c_point) from @tbl1 where a_goods='004'
select SUM(c_point) from @tbl1 where a_goods='005'
select a_goods, SUM(c_point) from @tbl1 group by a_goods  --商品ごとの平均点

select distinct b_empNo, SUM(c_point) over (partition by b_empNo) from @tbl1  --社員ごとの平均点 
select b_empNo, SUM(c_point) from @tbl1 group by b_empNo  --社員ごとの平均点

以上、SQL Server で SUM関数を使い合計値を求めるでした。

SQL Server AVG 平均

AVG 平均

SQL Server の対象データの平均値の求めるときに、AVG関数を使います。

平均値はいろいろなデータ分析で使用されるので良く使う指標だと思います。

構文: AVG ( [ ALL | DISTINCT ] expression )
引数: ALL すべての値に集計関数が適用されます。 ALL が既定値です。
    DISTINCT 一意な値の合計を返すことを指定します。
expression 定数、列、関数、および算術演算子、ビット演算子、文字列演算子の組み合わせを指定します。
NULL 値はすべて無視されます。(対象データになりません)

下のSQL例文を載せておきます。

declare @tbl1 table(a_class varchar(3), b_kbn char(1), c_point int)
insert into @tbl1 (a_class,b_kbn,c_point) values ('001','1',80)
insert into @tbl1 (a_class,b_kbn,c_point) values ('001','2',60)
insert into @tbl1 (a_class,b_kbn,c_point) values ('001','3',40)
insert into @tbl1 (a_class,b_kbn,c_point) values ('001','4',30)
insert into @tbl1 (a_class,b_kbn,c_point) values ('001','5',50)
insert into @tbl1 (a_class,b_kbn,c_point) values ('001','6',60)
insert into @tbl1 (a_class,b_kbn,c_point) values ('001','7',22)

--ALL
select AVG(ALL c_point) from @tbl1
select AVG(c_point) from @tbl1 --ALLが無くても同じ結果

--DISTINCT
--60が2行あるため、重複を省き計算される
select AVG(DISTINCT c_point) from @tbl1

--expression
--型変換、小数点以下も求める
select AVG(cast(c_point as float)) from @tbl1 --float型に
select AVG(cast(c_point as decimal(5,2))) from @tbl1
select cast(AVG(cast(c_point as decimal(5,2))) as decimal(5,2)) from @tbl1

もう一例
over や group by 句で括って結果を求める

declare @tbl1 table(a_class varchar(5), b_stdNo char(1), c_point int)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('国語','1',60)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('国語','2',70)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('国語','3',40)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('国語','4',20)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('国語','5',40)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('国語','6',50)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('国語','7',20)

insert into @tbl1 (a_class,b_stdNo,c_point) values ('算数','1',70)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('算数','2',60)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('算数','3',50)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('算数','4',80)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('算数','5',30)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('算数','6',60)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('算数','7',40)

insert into @tbl1 (a_class,b_stdNo,c_point) values ('理科','1',90)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('理科','2',70)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('理科','3',40)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('理科','4',70)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('理科','5',60)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('理科','6',50)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('理科','7',50)

insert into @tbl1 (a_class,b_stdNo,c_point) values ('社会','1',30)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('社会','2',50)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('社会','3',90)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('社会','4',40)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('社会','5',70)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('社会','6',80)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('社会','7',30)

insert into @tbl1 (a_class,b_stdNo,c_point) values ('英語','1',80)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('英語','2',60)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('英語','3',40)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('英語','4',30)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('英語','5',50)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('英語','6',60)
insert into @tbl1 (a_class,b_stdNo,c_point) values ('英語','7',20)

select avg(c_point) from @tbl1
select avg(c_point) from @tbl1 where a_class='国語'
select avg(c_point) from @tbl1 where a_class='算数'
select avg(c_point) from @tbl1 where a_class='理科'
select avg(c_point) from @tbl1 where a_class='社会'
select avg(c_point) from @tbl1 where a_class='英語'
select a_class, avg(c_point) from @tbl1 group by a_class  --科目ごとの平均点

select distinct b_stdNo, AVG(c_point) over (partition by b_stdNo) from @tbl1  --生徒ごとの平均点 
select b_stdNo, AVG(c_point) from @tbl1 group by b_stdNo  --生徒ごとの平均点

以上、SQL Server で AVG関数を使い平均値を求めるでした。