2008年7月30日水曜日

【SQL】重複のあるデータをHaving句で取得

--HAVING句を使ってidに重複のあるデータのみ取得する。
--概要・・・
--①id ごとに件数を集計する。(GROUP BY)
--②集計した結果が1より大きいものを選択する。(HAVING)
--テーブル
tbl_dataの構成例
--[id] AS int
--[data] AS varchar(50)


SELECT
[id]
FROM [tbl_data]
GROUP BY [id]
HAVING
COUNT(*) > 1

2008年7月23日水曜日

【Transact-SQL】引数で値を返すストアドプロシージャの作成

--引数で値を返すストアドプロシージャの作成
CREATE PROCEDURE
st_get_output_data
(
@inArg1 varchar(16)
,@outArg1 varchar(32) OUTPUT
)
AS
BEGIN
SET @outArg1='@inArg1 is ' + @inArg1
RETURN 0
END

--ストアドプロシージャの実行
DECLARE @RC int
DECLARE @inArg1 varchar(16)
DECLARE @outArg1 varchar(32)

SET @inArg1 = 'test data'

EXECUTE @RC = [test].[dbo].[st_get_output_data]
@inArg1
,@outArg1 OUTPUT

SELECT @outArg1

--実行結果
--@inArg1 is test data

【Transact-SQL】複数行を返すテーブル値関数を作成する

--複数行を返すテーブル値関数を作成する
CREATE FUNCTION tfn_get_table_data
(
@inID AS int
)
RETURNS @wk TABLE
--戻り値のテーブル定義
(
outID int
)
AS
BEGIN
--条件式(IF,ELSE)、WHILE文も使うことが出来る。

--呼出元に返す値をテーブルにINSERTする。
INSERT INTO @wk(outID)VALUES(@inID)
--処理の最後はRETURNで終了させる。
RETURN
END

2008年5月22日木曜日

【Transact-SQL】四捨五入・切捨て(ROUND関数)

--切捨て
PRINT '--------------------'
PRINT '切捨て'
PRINT '--------------------'
PRINT ROUND(555.55,2,1) --小数点第二位まで
PRINT ROUND(555.55,1,1) --小数点第一位まで
PRINT ROUND(555.55,0,1) --
PRINT ROUND(555.55,-1,1)--1の位
PRINT ROUND(555.55,-2,1)--10の位
--四捨五入の確認
PRINT '--------------------'
PRINT '四捨五入の確認'
PRINT '--------------------'
PRINT ROUND(555.54,1) --小数点第二位が4で切り捨て
PRINT ROUND(555.55,1) --小数点第二位が5で切り上げ


【結果】
--------------------
切捨て
--------------------
555.55
555.50
555.00
550.00
500.00
--------------------
四捨五入の確認
--------------------
555.50
555.60

2008年5月19日月曜日

【SQL】table1に存在しないIDのデータをtable2より取得する

--【table1に存在しないIDのデータをtable2より取得する】
-- table2とtable1をLEFT JOINで連結し、
-- table2から、tabel1.id=table2.idの条件でtable1.idがNULLのデータを取得する
--例)データ
------table1 | table2
--[id]  1   |  1
--[id]  2   |  2
--[id]  3   |  3
--[id]  4   |  4
--[id] NULL |  5
--[id] NULL |  6
-- LEFTJOINなので、table1に存在しないidはNULLになる

SELECT DEST.[id],DEST.[key]
FROM [test].[dbo].[table2] DEST
LEFT JOIN [test].[dbo].[table1] SRC
ON DEST.[id]=SRC.[id]
WHERE SRC.[id] IS NULL

【結果】
id key
----------- ----------
5 data_2_5
6 data_2_6

(2 行処理されました)

【SQL】重複した行を取り出す

--テーブルからフィールドAの値が重複しているデータを取り出す。
--手順:
--①GROUP BYでフィールドAを指定し、HAVING句を用いて
-- COUNT()の結果が2以上のデータのリストを取得する。
-- 例)リストの取得方法
SELECT [key]
FROM [test].[dbo].[tbl_union1]
GROUP BY [key]
HAVING COUNT([key])>1

--②①で取得したリストに入っているデータをテーブルから取得する。
SELECT [key]
FROM [test].[dbo].[tbl_union1]
WHERE [key] in
(SELECT [key]
FROM [test].[dbo].[tbl_union1]
GROUP BY [key]
HAVING COUNT([key])>1)

【結果】
key
----------
union1_3
union1_3
union1_3

(3 行処理されました)

2008年5月14日水曜日

【Transact-SQL】条件式とループ処理(IF-ELSE, WHILE)

--WHILEによるループ処理とIF-ELSEによる条件分岐
DECLARE @cnt INT
SET @cnt = 0

WHILE @cnt < style="color: rgb(0, 153, 0);">--ループ処理の中身はBEGIN-ENDで囲む
BEGIN
IF @cnt = 0
--条件によって実行される処理が複数の場合はBEGIN-ENDで囲む
BEGIN
Print '複数行実行開始'
Print '@cnt = 0'
Print '複数行実行終了'
END
ELSE IF @cnt = 1
BEGIN
Print '複数行実行開始'
Print '@cnt = 1'
Print '複数行実行終了'
END
--条件によって実行される処理が1つの場合はBEGIN-ENDは必要ない
ELSE IF @cnt = 2
Print '@cnt = 2'
ELSE
Print 'Else'
SET @cnt = @cnt +1
END -- End of WHILE Statement

【結果】
複数行実行開始
@cnt = 0
複数行実行終了
複数行実行開始
@cnt = 1
複数行実行終了
@cnt = 2
Else
Else