<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Database &#8211; REONTOSANTA</title>
	<atom:link href="https://knowledge.reontosanta.com/archives/category/database/feed" rel="self" type="application/rss+xml" />
	<link>https://knowledge.reontosanta.com</link>
	<description>Collection of personal knowledge</description>
	<lastBuildDate>Mon, 09 Apr 2018 05:51:24 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<atom:link rel='hub' href='https://knowledge.reontosanta.com/?pushpress=hub'/>
<site xmlns="com-wordpress:feed-additions:1">83369280</site>	<item>
		<title>SQLServerで断片化の状態に応じてIndexを再構築する</title>
		<link>https://knowledge.reontosanta.com/archives/1056</link>
					<comments>https://knowledge.reontosanta.com/archives/1056#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Tue, 30 May 2017 06:15:28 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=1056</guid>

					<description><![CDATA[SQLServerにおいて、インデックスが断片化してしまうとクエリの&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>SQLServerにおいて、インデックスが断片化してしまうとクエリのパフォーマンスが低下してくる。</p>
<p>インデックスの再構成(Reorganize)や再構築(Rebuild)を行うと断片化が解消される為、定期的にインデックスの再構成(Reorganize)や再構築(Rebuild)をすることでこれを解決することができる。</p>
<p>ただし、やみくもにデータベース内の全てのインデックスを再構成(Reorganize)や再構築(Rebuild)するとデータベースの規模が大きいほど、実行に多くの時間がかかってしまったり、ログファイルが大きくなりすぎてしまう。</p>
<p>そこで、断片化の状態を判断して再構成(Reorganize)または再構築(Rebuild)をする。</p>
<p>まず、インデックスの断片化の状態は <b>sys.dm_db_index_physical_stats </b>を使って調べることができる。</p>
<p><b>sys.dm_db_index_physical_stats </b>が返す <b>avg_fragmentation_in_percent </b>は論理的な断片化(インデックス内で順序が乱れたページ)の割合を示していて、再構成(Reorganize)または再構築(Rebuild)をするべきかどうかの判断の指標とすることができる。</p>
<p>例えば、以下のようなクエリで再構成(Reorganize)のクエリ、再構築(Rebuild)のクエリ、スキーマ名、テーブル名、インデックス名、インデックスID、オブジェクト内のパーティション番号、断片化の割合、インデックスページまたはデータページの合計数を取得することができる。</p>
<p><b>avg_fragmentation_in_percent &gt; 10</b> を指定することで、断片化率が 10 % 以上のインデックスを取得している。</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT
  'ALTER INDEX [' + C.name + '] ON [' + D.name + '].[' + B.name + '] REORGANIZE' AS ReorganizeCmd 
  , 'ALTER INDEX [' + C.name + '] ON [' + D.name + '].[' + B.name + '] REBUILD' AS RebuildCmd
  , D.name AS schemaname
  , B.name AS table_name
  , C.name AS index_name
  , C.index_id
  , A.partition_number
  , A.avg_fragmentation_in_percent
  , A.page_count 
FROM
  sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) AS A 
  INNER JOIN sys.objects AS B 
    ON A.object_id = B.object_id 
  INNER JOIN sys.indexes AS C 
    ON A.object_id = C.object_id 
    AND A.index_id = C.index_id 
  INNER JOIN sys.schemas D 
    ON B.schema_id = D.schema_id 
WHERE
  B.type = 'U' 
  AND C.index_id &gt; 0 
  AND A.page_count &gt; 1000 
  AND A.avg_fragmentation_in_percent &gt; 10 
ORDER BY
  A.avg_fragmentation_in_percent DESC</pre><p>インデックスの断片化の状態がわかったら、それによってインデックスを再構成(Reorganize)するか、または再構築(Rebuild)するか決定する。</p>
<p>例えば、10% 以上 30% 未満であれば再構成(Reorganize)、 30% 以上であれば再構築(Rebuild)するとすれば、上記のクエリで再構成のクエリ、または再構築のクエリを生成してそれぞれ実行する。</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-2608119644"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-104533642"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/1056/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1056</post-id>	</item>
		<item>
		<title>SQLServerで1つのクエリにより複数行をinsertする</title>
		<link>https://knowledge.reontosanta.com/archives/1015</link>
					<comments>https://knowledge.reontosanta.com/archives/1015#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Tue, 07 Mar 2017 05:26:18 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=1015</guid>

					<description><![CDATA[1つのクエリで、複数行をinsertする SQLServer2008&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<h2>1つのクエリで、複数行をinsertする</h2>
<p>SQLServer2008以降では、INSERT文で追加行をカンマでつなげることで実現できる。</p>
<p>なお、一度に追加できる最大行数は、1000行となる。</p><pre class="urvanov-syntax-highlighter-plain-tag">INSERT 
INTO test_table(col1, col2) 
VALUES
  (value1, value2)
  , (value1, value2)</pre><p>&nbsp;</p>
<p>ちなみに、SQLServer2005以前では複数行のINSERTは動作しないので、以下のような方法をとることになる。</p><pre class="urvanov-syntax-highlighter-plain-tag">INSERT 
INTO dbo.MyTable(C1, C2) 
SELECT
  Value1
  , Value2 
UNION ALL 
SELECT
  Value1
  , Value2 
UNION ALL 
SELECT
  Value1
  , Value2</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1690503909"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-884173367"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/1015/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1015</post-id>	</item>
		<item>
		<title>SQLServerで日付範囲から日(または月)ごとのデータを作成する</title>
		<link>https://knowledge.reontosanta.com/archives/1013</link>
					<comments>https://knowledge.reontosanta.com/archives/1013#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 13 Feb 2017 23:29:39 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=1013</guid>

					<description><![CDATA[日付範囲から日ごと、または月ごとに年月日(月ごとの場合、日は1日)を&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<h2>日付範囲から日ごと、または月ごとに年月日(月ごとの場合、日は1日)を作成する</h2>
<p>”2017年1月1日から2017年1月31日まで”のようなFrom/Toの日付範囲があり、そこからカレンダーのように日ごとのデータを取得したい場合、以下のような共通テーブル式(CTE:Common Table Expression)を利用した再帰クエリで作成することができる。</p><pre class="urvanov-syntax-highlighter-plain-tag">WITH DateTable(MyDate) AS ( 
  SELECT
    CONVERT(DATETIME, '2017/01/01') 
  UNION ALL 
  SELECT
    DATEADD(d, 1, MyDate) 
  FROM
    DateTable 
  WHERE
    MyDate &lt; CONVERT(DATETIME, '2017/01/31')
) 
SELECT
  MyDate 
FROM
  DateTable</pre><p>&nbsp;</p>
<p>また、月ごと(日は1日)にデータを取得したい場合は以下のクエリで作成できる。</p><pre class="urvanov-syntax-highlighter-plain-tag">WITH MonthTable(YearMonth) AS ( 
  SELECT
    CONVERT(DATETIME, '2016/12/01') 
  UNION ALL 
  SELECT
    DATEADD(m, 1, YearMonth) 
  FROM
    MonthTable 
  WHERE
    YearMonth &lt; CONVERT(DATETIME, '2017/03/01')
) 
SELECT
  YearMonth 
FROM
  MonthTable</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1119269285"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-1547827266"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/1013/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1013</post-id>	</item>
		<item>
		<title>SQLServerでdatetimeデータ型から日付部分のみを取得する</title>
		<link>https://knowledge.reontosanta.com/archives/1019</link>
					<comments>https://knowledge.reontosanta.com/archives/1019#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Tue, 10 Jan 2017 03:19:38 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=1019</guid>

					<description><![CDATA[datetimeデータ型から日付部分のみを取得する [crayon-&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<h2>datetimeデータ型から日付部分のみを取得する</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT GETDATE()</pre><p>上記のクエリを実行すると、&#8221;2017-01-10 17:13:05&#8243;のように日付と時刻が取得される。</p>
<p>SQLServer2008以降であれば、以下のクエリで日付だけを取得することができる。</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT CONVERT(date, getdate())</pre><p>このクエリを実行すると、&#8221;2017-01-10&#8243;を取得することができる。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1063632623"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-851249035"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/1019/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1019</post-id>	</item>
		<item>
		<title>SQLServerで日付の曜日を取得する</title>
		<link>https://knowledge.reontosanta.com/archives/970</link>
					<comments>https://knowledge.reontosanta.com/archives/970#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Thu, 24 Nov 2016 00:32:45 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=970</guid>

					<description><![CDATA[SQLServerでは、曜日を「月曜日」、「火曜日」など文字列で取得&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>SQLServerでは、曜日を「月曜日」、「火曜日」など文字列で取得する方法と、曜日を表す数字で取得する方法の２つがある。</p>
<p>&nbsp;</p>
<h2>曜日を文字列で取得する</h2>
<p>曜日を「月曜日」、「火曜日」などの文字列で取得するには、DATENAME関数を使用する。</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT DATENAME(WEEKDAY, GETDATE());</pre><p>※WEEKDAYは、DWでも可(取得対象とするdateの要素を指定)</p>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-2352331042"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>曜日を表す数字を取得する</h2>
<p>曜日を曜日を表す数字で取得する場合は、DATEPART関数を使用する。</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT DATEPART(WEEKDAY, GETDATE());</pre><p>※WEEKDAYは、DWでも可(取得対象とするdateの要素を指定)</p>
<h4>曜日と数字の対応表</h4>

<table id="tablepress-26" class="tablepress tablepress-id-26">
<thead>
<tr class="row-1">
	<th class="column-1">曜日</th><th class="column-2">返される数字</th>
</tr>
</thead>
<tbody class="row-striping row-hover">
<tr class="row-2">
	<td class="column-1">日曜日</td><td class="column-2">1</td>
</tr>
<tr class="row-3">
	<td class="column-1">月曜日</td><td class="column-2">2</td>
</tr>
<tr class="row-4">
	<td class="column-1">火曜日</td><td class="column-2">3</td>
</tr>
<tr class="row-5">
	<td class="column-1">水曜日</td><td class="column-2">4</td>
</tr>
<tr class="row-6">
	<td class="column-1">木曜日</td><td class="column-2">5</td>
</tr>
<tr class="row-7">
	<td class="column-1">金曜日</td><td class="column-2">6</td>
</tr>
<tr class="row-8">
	<td class="column-1">土曜日</td><td class="column-2">7</td>
</tr>
</tbody>
</table>

<p>曜日を表す数字は、CASE式を使って以下のように文字列に変換することができる。</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT 
  CASE DATEPART(WEEKDAY, GETDATE()) 
       WHEN 1 THEN 'Sun' 
       WHEN 2 THEN 'Mon' 
       WHEN 3 THEN 'Tue' 
       WHEN 4 THEN 'Wed' 
       WHEN 5 THEN 'Thu' 
       WHEN 6 THEN 'Fri' 
       WHEN 7 THEN 'Sat' 
  END</pre><p>※WEEKDAYは、DWでも可(取得対象とするdateの要素を指定)</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-4053123136"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-3474140999"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/970/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">970</post-id>	</item>
		<item>
		<title>SQLServerで数値判定</title>
		<link>https://knowledge.reontosanta.com/archives/968</link>
					<comments>https://knowledge.reontosanta.com/archives/968#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 07 Nov 2016 01:16:35 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=968</guid>

					<description><![CDATA[式が数値型として有効かどうかを調べるには、ISNUMERICを利用す&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>式が数値型として有効かどうかを調べるには、ISNUMERICを利用する。</p><pre class="urvanov-syntax-highlighter-plain-tag">ISNUMERIC(expression)</pre><p>expressionが有効な数値型ならば戻り値1、それ以外は戻り値0となる。</p>
<p>※プラス(&#8216;+&#8217;)、マイナス(&#8216;-&#8216;)、通貨記号(&#8216;$&#8217;等)、指数表記(&#8216;E&#8217;、&#8217;D&#8217;)も数値として認識される。</p>
<p>&nbsp;</p>
<h2><strong>サンプル(WHERE句で利用)</strong></h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT * FROM target_table WHERE ISNUMERIC(target_column) = 1</pre><p>実行結果は、target_columnが数値型のものだけが抽出される。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-2000132814"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-2871582732"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/968/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">968</post-id>	</item>
		<item>
		<title>重複データからMAX値を条件にレコードを取得する</title>
		<link>https://knowledge.reontosanta.com/archives/921</link>
					<comments>https://knowledge.reontosanta.com/archives/921#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 17 Oct 2016 23:59:09 +0000</pubDate>
				<category><![CDATA[Sql]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=921</guid>

					<description><![CDATA[以下のようなデータからcode_1毎にyear_monthが最大(最&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>以下のようなデータからcode_1毎にyear_monthが最大(最新)のレコードを取得する。</p>
<p>
<table id="tablepress-24" class="tablepress tablepress-id-24">
<thead>
<tr class="row-1">
	<th class="column-1">code_1</th><th class="column-2">code_2</th><th class="column-3">year_month</th><th class="column-4">value</th>
</tr>
</thead>
<tbody class="row-striping row-hover">
<tr class="row-2">
	<td class="column-1">A</td><td class="column-2">10001</td><td class="column-3">201511</td><td class="column-4">100</td>
</tr>
<tr class="row-3">
	<td class="column-1">A</td><td class="column-2">10002</td><td class="column-3">201512</td><td class="column-4">200</td>
</tr>
<tr class="row-4">
	<td class="column-1">B</td><td class="column-2">20001</td><td class="column-3">201509</td><td class="column-4">300</td>
</tr>
<tr class="row-5">
	<td class="column-1">B</td><td class="column-2">20002</td><td class="column-3">201510</td><td class="column-4">400</td>
</tr>
</tbody>
</table>
</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT
  t2.code_1
  , t2.code_2
  , t2.yaer_month
  , t2.value
FROM
  target_table t2
  INNER JOIN (
              SELECT
                code_1
                , MAX(year_month) AS year_month
              FROM
                target_table
              GROUP BY
                code_1
             ) t1
          ON t1.code_1 = t2.code_1
         AND t1.year_month = t2.year_month
ORDER BY
  t2.code_1
  , t2.code_2
  , t2.yaer_month</pre><p>&nbsp;</p>
<p>以下のようにcode_1、yaer_monthのみでは、重複レコードを排除できない状態でcode_2が最大のレコードを取得する。</p>
<p>
<table id="tablepress-25" class="tablepress tablepress-id-25">
<thead>
<tr class="row-1">
	<th class="column-1">code_1</th><th class="column-2">code_2</th><th class="column-3">year_month</th><th class="column-4">value</th>
</tr>
</thead>
<tbody class="row-striping row-hover">
<tr class="row-2">
	<td class="column-1">A</td><td class="column-2">10001</td><td class="column-3">201511</td><td class="column-4">100</td>
</tr>
<tr class="row-3">
	<td class="column-1">A</td><td class="column-2">10002</td><td class="column-3">201512</td><td class="column-4">200</td>
</tr>
<tr class="row-4">
	<td class="column-1">A</td><td class="column-2">10003</td><td class="column-3">201512</td><td class="column-4">300</td>
</tr>
</tbody>
</table>
</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT
  t4.code_1
  , t4.code_2
  , t4.yaer_month
  , t4.value
FROM
  target_table t4
  INNER JOIN (
              SELECT
                t2.code_1
                , t2.yaer_month
                , MAX(t2.code_2) AS code_2
              FROM
                target_table t2
                INNER JOIN (
                            SELECT
                              code_1
                              , MAX(year_month) AS year_month
                            FROM
                              target_table
                            GROUP BY
                              code_1
                           ) t1
                        ON t1.code_1 = t2.code_1
                       AND t1.year_month = t2.year_month
              GROUP BY
                t2.code_1
                , t2.yaer_month
             ) t3
          ON t3.code_1 = t4.code_1
         AND t3.yaer_month = t4.yaer_month
         AND t3.code_2 = t4. code_2
ORDER BY
  t4.code_1
  , t4.code_2
  , t4.yaer_month</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-2329313371"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-539929832"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/921/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">921</post-id>	</item>
		<item>
		<title>SQLServerで値の丸めを行う</title>
		<link>https://knowledge.reontosanta.com/archives/933</link>
					<comments>https://knowledge.reontosanta.com/archives/933#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Tue, 02 Aug 2016 02:03:38 +0000</pubDate>
				<category><![CDATA[SQLServer]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=933</guid>

					<description><![CDATA[SQLServerで値の丸め(切り上げ・切り捨て・四捨五入)を行うに&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>SQLServerで値の丸め(切り上げ・切り捨て・四捨五入)を行うには、FLOOR、CELLING、ROUNDといったファンクションを利用する。</p>
<ul>
<li>FLOOR<br />
整数への切り上げを行う<br />
第1引数：対象の値(数値)</li>
<li>CELLING<br />
整数への切り捨てを行う<br />
第1引数：対象の値(数値)</li>
<li>ROUND<br />
四捨五入を行う<br />
第1引数：対象の値(数値)<br />
第2引数：数値を丸める際の有効桁数(例：-1→10の位、0→1の位、1→小数点第一位)<br />
第3引数：オプション機能(0：四捨五入、0以外：切り捨て／デフォルト(未指定)は0)</li>
</ul>
<p>&nbsp;</p>
<h2>整数への切り上げ・切り捨て・四捨五入</h2>
<p>整数への切り上げ・切り捨て・四捨五入は特に意識することなく各ファンクションを利用する。</p>
<p>＜切り上げ＞</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT CEILING(1.4); --&gt; 2
SELECT CEILING(1.5); --&gt; 2
SELECT CEILING(1.01); --&gt; 2</pre><p>＜切り捨て＞</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT FLOOR(1.4); --&gt; 1
SELECT FLOOR(1.5); --&gt; 1
SELECT ROUND(1.4, 0, 1); --&gt; 1.0
SELECT ROUND(1.5, 0, 1); --&gt; 1.0</pre><p>＜四捨五入＞</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT ROUND(1.4, 0); --&gt; 1.0
SELECT ROUND(1.5, 0); --&gt; 2.0</pre><p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-2529087225"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>小数点第二位への切り上げ・切り捨て・四捨五入</h2>
<p>小数点以下の単位で切り捨て・四捨五入を行うには、ROUNDを利用することで可能。</p>
<p>ただし、切り上げについては、一度整数に変換してCEILINGで切り上げを行った後、改めて元の精度に戻すなどの工夫が必要となる。</p>
<p>＜切り上げ＞</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT CEILING(1.004 * 100) / 100 --&gt; 1.010000
SELECT CEILING(1.005 * 100) / 100 --&gt; 1.010000
SELECT CEILING(1.0001 * 100) / 100 --&gt; 1.010000</pre><p>＜切り捨て＞</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT ROUND(1.004, 2, 1); --&gt; 1.000
SELECT ROUND(1.005, 2, 1); --&gt; 1.000</pre><p>＜四捨五入＞</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT ROUND(1.004, 2); --&gt; 1.000
SELECT ROUND(1.005, 2); --&gt; 1.010</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-760895132"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-10490663"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/933/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">933</post-id>	</item>
		<item>
		<title>Oracleでのデータベースリンクの利用とシノニムの活用</title>
		<link>https://knowledge.reontosanta.com/archives/916</link>
					<comments>https://knowledge.reontosanta.com/archives/916#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Tue, 19 Apr 2016 00:37:15 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=916</guid>

					<description><![CDATA[Oracleでは、他のデータベースにアクセスする手段としてデータベー&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>Oracleでは、他のデータベースにアクセスする手段としてデータベースリンクがある。<br />
データベースリンクを利用することで、他のデータベース上のテーブルに対してデータの操作を行うことができる。</p>
<p>&nbsp;</p>
<h2>データベースリンクの作成</h2>
<p>以下のコマンドを実行することでデータベースリンクの作成ができる。<br />
※接続先Oracleの接続名（ネットサービス名）は、&#8221;&#8216;&#8221;(シングルクォーテーション)で囲う必要がある。</p><pre class="urvanov-syntax-highlighter-plain-tag">CREATE DATABASE LINK DB_LINK      --データベースリンク名
CONNECT TO USER_NAME              --接続先Oracleのユーザ名
IDENTIFIED BY PASSWORD            --接続先Oracleのパスワード
USING 'CONNECTION_NAME'           --接続先Oracleの接続名（ネットサービス名）</pre><p>尚、以下のSELECT文にてデータベースリンクの存在を確認できる。</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT * FROM DBA_DB_LINKS</pre><p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-540167376"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>データベースリンク先のテーブルの指定</h2>
<p>&#8220;テーブル名@データベースリンク名&#8221;で対象テーブルにアクセスすることができる。</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT * FROM TARGET_TABLE@DB_LINK</pre><p>&nbsp;</p>
<h2>シノニムを作成して簡潔にテーブルを指定</h2>
<p>シノニムを作成することで、通常のテーブルと同じように扱うことができる。</p><pre class="urvanov-syntax-highlighter-plain-tag">CREATE SYNONYM TARGET_TABLE --シノニム名
FOR TARGET_TABLE@DB_LINK    --テーブル名@データベースリンク名</pre><p>FROM句にシノニム名を指定することで、データベースリンク先のテーブルを参照できる。</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT * FROM TARGET_TABLE</pre><p>&nbsp;</p>
<h2>シノニムの削除</h2>
<p>以下のコマンドでシノニムを削除できる。</p><pre class="urvanov-syntax-highlighter-plain-tag">DROP SYNONYM TARGET_TABLE --シノニム名</pre><p>&nbsp;</p>
<h2>データベースリンクの削除</h2>
<p>以下のコマンドでデータベースリンクを削除できる。</p><pre class="urvanov-syntax-highlighter-plain-tag">DROP DATABASE LINK DB_LINK  --データベースリンク名</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-2469793432"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-4167667808"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/916/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">916</post-id>	</item>
		<item>
		<title>Oracleで暗号化パッケージを利用する</title>
		<link>https://knowledge.reontosanta.com/archives/913</link>
					<comments>https://knowledge.reontosanta.com/archives/913#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 04 Apr 2016 14:01:40 +0000</pubDate>
				<category><![CDATA[Oracle]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=913</guid>

					<description><![CDATA[Oracle(10g以降)のDBMS_CRYPTO.ENCRYPT／&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>Oracle(10g以降)のDBMS_CRYPTO.ENCRYPT／DBMS_CRYPTO.DECRYPTを使用してデータの暗号化・復号化を実現できる。</p>
<p>&nbsp;</p>
<h2>事前準備</h2>
<p>DBMS_CRYPTOを利用するには、実行権限が必要となる為、SYSユーザーでログインして権限を付与する。</p><pre class="urvanov-syntax-highlighter-plain-tag">GRANT EXECUTE ON DBMS_CRYPTO TO user_name;</pre><p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-461629895"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>暗号化</h2>
<p>以下のサンプルでは、文字列を暗号化した結果をbase64でエンコードしてVARCHAR2に変換した値を返している。</p><pre class="urvanov-syntax-highlighter-plain-tag">暗号化SQL
SELECT
  UTL_RAW.CAST_TO_VARCHAR2( --VARCHAR2に変換
    UTL_ENCODE.BASE64_ENCODE( --base64でエンコード
      DBMS_CRYPTO.ENCRYPT( --暗号化
        UTL_I18N.STRING_TO_RAW ('1', 'AL32UTF8'), --ROWデータに変換
        8 + 256 + 4096, --暗号化方式+暗号ブロック連鎖+データ補完(AES256/CBC/PKCS5)
        UTL_I18N.STRING_TO_RAW(RPAD('mypassword', 32, CHR(0)), 'AL32UTF8') --パスワード(ROWデータに変換)
      )
    )
  ) AS encryption
FROM dual;</pre><p>実行結果</p><pre class="urvanov-syntax-highlighter-plain-tag">ENCRYPTION
--------------------------
00705BMd3YpkaeZxCq4nlg==</pre><p>&nbsp;</p>
<h2>復号化</h2>
<p>以下のサンプルでは、base64でエンコードされた暗号化文字列を復号化してVARCHAR2に変換した値を返している。</p><pre class="urvanov-syntax-highlighter-plain-tag">SELECT
  UTL_I18N.RAW_TO_CHAR( --VARCHAR2に変換
    DBMS_CRYPTO.DECRYPT( --復号化
      UTL_ENCODE.BASE64_DECODE( --base64でデコード
        UTL_RAW.CAST_TO_RAW('00705BMd3YpkaeZxCq4nlg==') --ROWデータに変換
      ),
      8 + 256 + 4096, --暗号化方式+暗号ブロック連鎖+データ補完(AES256/CBC/PKCS5)
      UTL_I18N.STRING_TO_RAW(RPAD('mypassword', 32, CHR(0)), 'AL32UTF8') --パスワード(ROWデータに変換)
    )
    , 'AL32UTF8'
  ) AS decryption
FROM dual;</pre><p>実行結果</p><pre class="urvanov-syntax-highlighter-plain-tag">DECRYPTION
--------------------------
1</pre><p>&nbsp;</p>
<h2>暗号化／復号化のストアドファンクション</h2>
<p>ストアドファンクションの作成</p><pre class="urvanov-syntax-highlighter-plain-tag">-- 暗号化ファンクション
CREATE OR REPLACE FUNCTION AES256_ENCRYPT(
  P_TEXT      VARCHAR2, --暗号化対象文字列
  P_PASSWORD  VARCHAR2  --パスワード
)
RETURN VARCHAR2
IS
  vEncrypted  RAW(2000);
BEGIN
  --暗号化
  vEncrypted := DBMS_CRYPTO.ENCRYPT(
    --暗号化対象文字列(ROWデータに変換)
    src =&gt; UTL_I18N.STRING_TO_RAW (P_TEXT,  'AL32UTF8'),
    --暗号化方式+暗号ブロック連鎖+データ補完(AES256/CBC/PKCS5)
    typ =&gt; DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5,
    --パスワード(ROWデータに変換)
    key =&gt; UTL_I18N.STRING_TO_RAW(RPAD(P_PASSWORD, 32, CHR(0)), 'AL32UTF8'));
  --暗号化した値をbase64でエンコードしてVARCHAR2に変換して復帰
  RETURN UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(vEncrypted));
END;
/
-- 復号化ファンクション
CREATE OR REPLACE FUNCTION AES256_DECRYPT(
  P_ENCRYPTED  VARCHAR2, --復号化対象文字列
  P_PASSWORD   VARCHAR2  --パスワード
)
RETURN VARCHAR2
IS
  vRaw  RAW(2000);
BEGIN
  --暗号化文字列をbase64でデコード
  vRaw := UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(P_ENCRYPTED));
  --復号化
  vRaw := DBMS_CRYPTO.DECRYPT(
    --復号化対象
    src =&gt; vRaw,
    --暗号化方式+暗号ブロック連鎖+データ補完(AES256/CBC/PKCS5)
    typ =&gt; DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5,
    --パスワード
    key =&gt; UTL_I18N.STRING_TO_RAW(RPAD(P_PASSWORD, 32, CHR(0)), 'AL32UTF8'));
  --復号化した値をVARCHAR2に変換して復帰
  RETURN UTL_I18N.RAW_TO_CHAR (vRaw, 'AL32UTF8');
END;
/</pre><p>ストアドファンクションの実行結果</p><pre class="urvanov-syntax-highlighter-plain-tag">SQL&gt; SELECT AES256_ENCRYPT('1', 'mypassword') FROM dual;

AES256_ENCRYPT('1','MYPASSWORD')
--------------------------------------------------------------------------------
00705BMd3YpkaeZxCq4nlg==

SQL&gt; SELECT AES256_DECRYPT('00705BMd3YpkaeZxCq4nlg==', 'mypassword') FROM dual;

AES256_DECRYPT('00705BMD3YPKAEZXCQ4NLG==','MYPASSWORD')
--------------------------------------------------------------------------------
1</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1940591984"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-465941280"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/913/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">913</post-id>	</item>
	</channel>
</rss>
