<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/note4recurrent/">
    <title>note4recurrent @ ウィキ</title>
    <link>http://w.atwiki.jp/note4recurrent/</link>
    <atom:link href="https://w.atwiki.jp/note4recurrent/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>note4recurrent @ ウィキ</description>

    <dc:language>ja</dc:language>
    <dc:date>2024-09-30T14:49:32+09:00</dc:date>
    <utime>1727675372</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/note4recurrent/pages/27.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/note4recurrent/pages/41.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/note4recurrent/pages/40.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/note4recurrent/pages/39.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/note4recurrent/pages/38.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/note4recurrent/pages/36.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/note4recurrent/pages/35.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/note4recurrent/pages/34.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/note4recurrent/pages/33.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/note4recurrent/pages/32.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/note4recurrent/pages/27.html">
    <title>python-train</title>
    <link>https://w.atwiki.jp/note4recurrent/pages/27.html</link>
    <description>
      練習サイトには[[Paiza&gt;https://paiza.jp/]]を使ってます。

#contents()

-Mac
--[[環境構築&gt;https://prog-8.com/docs/python-env]]
--[[openpy&gt;https://gammasoft.jp/support/how-to-use-openpyxl-for-excel-file/]]

-標準入力
 N, M, K = map(int, input().split())
 
 line = input().rstrip()
 line.split(&quot;,&quot;)　　　　　　　　　　　　　　　　　　　　　　　　//カンマ切を切り出す
-入力の切り分け
  input_line = input()
  line = input_line.split()
  
  n1 =  int(line[0])
  n2  = int(line[1])
  n3  = int(line[2])
 
 kabusuu = 0 
 money = 0
 for i in range(1,n1):
    input_line = input()
    kabuka = int(input_line)
    if kabuka &lt;= n2 :
        kabusuu +=1
        money -= kabuka
    elif kabuka &gt;= n3:
        if kabusuu &gt; 0:
            money += kabuka * kabusuu
            kabusuu = 0
 
 input_line = input()
 kabuka = int(input_line) 
 money = money+kabusuu*kabuka 
 print(money)

-小数で受ける
 input_line = input()
 taion = float(input_line)
 if taion &lt; 37:
     print(&quot;OK&quot;)
 else:
     print(&quot;NG&quot;)

***配列
-宣言
 num  =[0] * 5
 
 for i in range(0,5):
     input_line = input()
     num[i-1] = int(input_line)  
 
 print(max(num)) 
 print(min(num))

-配列操作
 l.append(100)
 list = [1, 2, 3, 4, 5]
 list.insert(3, 10)　         結果[1, 2, 3, １０，　4, 5]　　　　　
 list6 = [1, 2, 3, 4, 5]　
 list.pop(2)　　　　　　　　　　　　　　　　　結果[1, 2, 3, 4, 5]
-配列のソート 
 　input_line = input()
 　line = input_line.split()
 　line.sort()　　　　　　　　　　　　　　　　　　　　　　　　　//配列.sort()
 　print(line[1])
-sorted
 x = [random.randint(0, 100) for _ in range(10)]
 print(x)
 print(sorted(x))
 print(sorted(x, reverse=True))
 list.sort(x)
 print(x)
 list.sort(x, reverse=True)
 print(x)
 //sortedメソッドは元のリストを変更しないが、list.sortメソッドは元のリストを変更する。

-複数キーによる二次元配列のソート(中途半端：要検討）
 s = [(&#039;john&#039;, &#039;A&#039;, 15),(&#039;jane&#039;, &#039;B&#039;, 12), (&#039;dave&#039;, &#039;B&#039;, 10),(&#039;ted&#039;, &#039;A&#039;, 13), (&#039;zzz&#039;, &#039;B&#039;, 15)]
 s = sorted(s, key=lambda x: x[1])     
 print(s)
 v = sorted(s, key=lambda x : x[2], reverse=True)  # sort on secondary key 
print(v)



-二次元配列のソート
 li = sorted(li, reverse=True, key=lambda x: x[1])

-区切り文字を指定した切り分け例
 　input_line = input()
 　line = input_line.split(&quot;:&quot;)
 　ji =  int(line[0])
 　fun  = int(line[1])
 　if ji &lt; 8:
 　    ji +=24
 　ji -= 8　
 　print(str(ji)+&quot;:&quot;+str(fun))
-追加
 numbers = [3, 1, 4, 1, 5]
 results = []
 for item in numbers:
     results.append(item * 10)
-削除
  del array[0][1]
 array.pop(-1) で最後の要素を削除
　array.pop(2) で２番めの要素を削除　 
-二次元配列をforで作る[[列]行] この例では４行３列　すべてのデータに0
 numbers = [[0 for i in range(3)] for j in range(4)]
 numbers[0][1] = 2
-numpy を使って二次元配列を宣言
 import numpy as np: 使うときに便利なように別名としてpyとしている。必要ではない。
 
 list = np.zeros((3, 3))
-二次元配列のソート　reverse で昇順、降順を設定できる（デフォルトは昇順）
 　arr = [
 　　　　　　　　[3, &quot;b&quot;],
 　　　　　　　　[1, &quot;c&quot;],
 　　　　　　　　[2, &quot;a&quot;]]
 　arr.sort(reverse=True, key=lambda x:x[1])
-二次元配列に要素を追加（二次元が崩れないように）
 numbers.append([&quot;10&quot;,&quot;9&quot;])
-配列
 players = &quot;勇者,戦士,魔法使い,忍者&quot;
 list = players.split(&quot;,&quot;)
 list.remove(&quot;忍者&quot;)    //忍者を取り除く
 list.append(&quot;霧島&quot;)　　　//追加
 print(list)
-二次元配列の複数キーによるソート
 csuu = int(input())
 medals = [[0 for i in range(3)] for j in range(csuu)]
 for i in range(csuu):
     G, S, B = map(int, input().split())
     medals[i][0]=G
     medals[i][1]=S
     medals[i][2]=B
 medals.sort(reverse=True, key=lambda x: (x[0],x[1],x[2]))
 
 for i in range(csuu):
     print(medals[i][0],medals[i][1],medals[i][2])
-map
 list1 = [“1″,”2″,”3″,”4″,”5”]
 print(list(map(int, list1)))
***辞書
-辞書データの作成、取り出し
 enemyDictionary = {&quot;ザコ&quot;:&quot;スライム&quot;, &quot;中ボス&quot;:&quot;ドラゴン&quot;, &quot;ラスボス&quot;:&quot;魔王&quot;}　// { キー:データ,}
 print(enemyDictionary)
 print(enemyDictionary[&quot;中ボス&quot;]) // ドラゴンが表示される
 level = &quot;ラスボス&quot;
 print(enemyDictionary[level])　　　　　// 魔王が表示される
-辞書データの追加・削除
 enemies = {&quot;ザコ&quot;:&quot;スライム&quot;, &quot;中ボス&quot;:&quot;ドラゴン&quot;, &quot;ラスボス&quot;:&quot;魔王&quot;}
 print(enemies)
 print(enemies[&quot;中ボス&quot;])
 print(len(enemies))
 
 enemies[&quot;ザコ2&quot;] = &quot;メタルモンスター&quot; //ザコ２というキーを持つデータメタルモンスターを追加
 print(enemies)
 print(len(enemies))
 
 enemies[&quot;中ボス&quot;] = &quot;スターキメラ&quot; //中ボスというキーを持つデータのデータをスターキメラに変更
 print(enemies)
 print(len(enemies))
 
 del enemies[&quot;ザコ&quot;]　　　　　　　　　　　　　　　　　　//ザコレコードを削除（キーもデータもなくなる）
 print(enemies)
 print(len(enemies))

-辞書
 n = int(input())
 f = {}
 for i in range(n):
     s = input().split()
     f[s[0]] = int(s[1])
 
 key = input()
 print(f[key])

-forで操作
 enemies = {&quot;ザコ&quot;:&quot;スライム&quot;, &quot;中ボス&quot;:&quot;ドラゴン&quot;, &quot;ラスボス&quot;:&quot;魔王&quot;}
 print(enemies)
 print(enemies[&quot;中ボス&quot;])
 
 for rank in enemies:
 	print(enemies[rank] + &quot;が、あらわれた！&quot;) //enemies だけだとデータが取り出される
 	print(rank)                                               //キーだけが取り出される 
 for (rank, enemy) in enemies.items():　　　　　　　　//キーとデータのセットで取り出したいとき：この場合キーはrankにデータはenemyに入る
 	print(rank + &quot;の&quot; + enemy + &quot;が、あらわれた！&quot;)
-辞書を配列のように使う例
 n=int(input())
 enemy = {}
 for i in range(n):
     enemy[input()]=0
 n=int(input())
 for i in range(n):
     atack = input().split()
     pt = int(atack[1])+enemy[atack[0]]
     enemy[atack[0]]=pt
 aim = input()
 print(enemy[aim])
-辞書型のデータを引数に出来る。
 def introduce(**people):
      for name, greeting in people.items():
          print(&quot;私は&quot; + name + &quot;です。&quot; + greeting)
  
  introduce(hero = &quot;はじめまして&quot;, villager = &quot;こんにちは&quot;, soldier = &quot;よろしくお願いします&quot;)

-辞書のソート
 A, B, C = map(int, input().split())
 　
 dicA ={}
 dicB ={}
 for i in range(A):
     x,y = map(int, input().split())
     dicA[x]=y
 #ソートすると辞書ではなくなるので一手間かかる
 list = sorted(dicA.items(), key=lambda x: x[0])
 dicA.clear()
 dicA.update(list)
 
 for i in range(B):
     x,y = map(int, input().split())
     dicB[x]=y
 #i にはキーが入っている。値を取り出すために dicA[i] としている。dicAの値をキーにdicBの値を取り出している。
 for i in dicA:
     print(i,dicB[dicA[i]])
 
　#リストのまま使うのであれば普通の２次元配列として操作できる。

-辞書に格納されているかどうかを確認する。辞書の値を操作したい時に、チェックする時に使う。
 d= {&#039;key1&#039;: &#039;val1&#039;, &#039;key2&#039;: &#039;val2&#039;, &#039;key3&#039;: &#039;val3&#039;, &#039;key4&#039;: &#039;val4&#039;}
 
 print(d.get(&#039;key5&#039;))
 # None : 何も指定しなければNoneが返される
 print(d.get(&#039;key5&#039;, &#039;NO KEY&#039;))
 # NO KEY
 
 print(d.get(&#039;key5&#039;, 100))
 # 100



***ループ
- 標準入力とループ処理
 count = int(input())
 print(&quot;データ個数 &quot; + str(count))
 for i in range(count):
     line = input().rstrip()
     print(&quot;hello &quot; + line)
-行末の改行コードを取り除く
      line = input().rstrip()
-while loop
 n=0
 while True:
     n +=1
     if n == 10:
         print(10)
         break
     print(n)
-loop2
 f = True
 n=0
 while f:
     n +=1
     if n == 10:
         f = False
     print(n)
-loop,string   テキストから一文字ずつとりだす
 for i in &quot;hypo&quot;:
     print(i)

-loop: ２で何回割れるか
 N = 10
 i=0
 while N &gt; 1:
     i += 1
     N = N//2
 print(i)
***添字無しで要素取り出し
-拡張 for 文
 numbers = [12, 34, 56, 78, 90]
 total = 0
 for num in numbers: 
 	total = total + num
 print(total)

***文字列操作
-テキスト末尾を削除
 print(ans.rstrip())
-文字列逆転
 input_line = input() 
 print(input_line.upper())
 input_line = input()
 ans = &quot;&quot;
 for i in range(len(input_line)-1,-1,-1):
     ans = ans + str(input_line[i])
 print(ans)
-文字列
 input_line = input()
 line = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;
 for i in range(0,26):
     if line[i] == input_line:
         print(i+1)
-文字列連結
 input_line = input()
 inNum = int(input_line)
 ans =&quot;&quot;
 for i in range(1,10):
     if i &lt; 9 :
         ans = ans + str(i * inNum)+&quot; &quot;
     else:
         ans = ans + str(i * inNum) 
 print(ans)
-文字列判定；同じ文字ばかりかどうかを二重ループで判定
 input_line = input()
 ans = &quot;NG&quot;
 for i in range(0,len(input_line)):
     for j in range(0,len(input_line)):
         if input_line[i] != input_line[j]:
             ans = &quot;OK&quot;
 print(ans)
-文字列の有無
 ngword = input()
 text = input()
 if ngword in text:
     print(&quot;NG&quot;)
 else:
     print(text)
-文字数を数える# &quot;A&quot;という文字が何個あるか調べる
 s = &#039;aAaAAbAccdd&#039;
 s.count(&#039;A&#039;)
-replace : &#039;&#039; を置き換え対象とすることで任意の文字列を削除できる
 s = input()
 print(s.replace(&#039;False&#039;, &#039;True&#039;))
 print(s.replace(&#039;kesu&#039;,&#039;&#039;))  //    kesu という文字列を元の文字列から削除する 
-文字列に改行を入れる
 input_line = input()
 ans = &quot;&quot;
 for i in range(0,len(input_line)):
     if i == 9:
         ans = ans+input_line[i]+&#039;\n&#039;
     else:
         ans = ans+input_line[i]　
 print(ans)
-文字列から数字を取り出す。取り出されたデータをintすることを忘れずに！ import re が要る
 import re
 input_line = int(input())
 s = &quot;&quot;
 usrs = [&quot;&quot;]* input_line
 unum = [0] * input_line
 for i in range(input_line):
     s = input()
     usrs[i] = s
     unum[i] = int(re.sub(r&quot;\D&quot;, &quot;&quot;, s))　　　　　文字列ｓから数値のみを取り出　re.sub
 kariU = &quot;&quot;
 kariN = 0
 for i in range (0,len(usrs)):                    並べ替え
     for j in range(0,len(usrs)):
         if unum[i] &lt; unum[j]:
             kariU  = usrs[i]
             kariN = unum[i]
             usrs[i] = usrs[j]
             unum[i] = unum[j]
             usrs[j] = kariU
             unum[j] = kariN 
 
 for i in usrs:
     print(i)
-re           import re 
 re.sub()は、文字列を置換するための関数です。
 「r”\D”」で数字以外を指定し、置換後の文字列を「””」とすることで、文字列から数字だけを取り出すことができます。
 \D が数字を表し　r　で逆にすることができる
 普通にreplaceのように使うことも可能
 import re
 s = &quot;2020年&quot;
 result = re.sub(&quot;年&quot;, &quot;hoge&quot;, s)
 print(result)　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　

-文字列の一番長いものを求める
 txt = [0] *3
 for i in range(0,3):
     txt[i] = len(input())
 print(max(txt))

-文字列関数
 txt.islower()    // txt がすべて小文字の場合True
 text.capitalize()　　//先頭の文字を大文字にし他は小文字
 text.upper()        //すべて大文字
-  【 集合を用いる 】&amp;br;まず、数列 A と、数列 B の間には要素の重複が生じえるということに注意が必要です。また、数列 A 内、数列 B 内においても重複が生じえることにも注意してください。 &amp;brこの重複を取り除くために、集合を使います。集合を定義する際、set 関数を使います。&amp;br;数列 A と、数列 B を連結し、引数として渡すことで、1 行で簡潔に書けます。
リストの連結は + 演算子を使います。&amp;br;集合は定義の際、重複を除去してくれるので、重複除去の処理を自分で実装する必要はありません。
 N = int(input())
 A = input().split() 
 B = input().split()
 
 for i in range(len(A)):
     A[i] = int(A[i])
     B[i] = int(B[i])
 
 # A = [int(x) for x in input().split()]
 # B = [int(x) for x in input().split()]
 
 c = set(A + B)
 
 print(&quot; &quot;.join(map(str, sorted(c))))
-後ろから指定文字数を削除。Python では負のインデキシングを使用することができます。最後の文字はインデックス-1 から始まり、-2、-3、-4 の順で最初の文字に到達します。
 my_str=&quot;python string&quot;
 final_str = my_str[:-3]
 print(final_str)
 出力：
 python str

***Tech lib
-２進数への変換
 n = 4
 ans = &quot;&quot;
 ans2 = &quot;&quot; 
 while n &gt; 0:
       ans = ans + str(n%2)
       n=n//2
 for i in range(len(ans)-1,-1,-1):
     ans2=ans2+ans[i]
 print(ans2)

-複数行を一回で読み込む
 import sys
 array = []
 for line in  sys.stdin.readlines():
     array.append(line.rstrip()) 
 print(array)

-べき乗
 input_line = input()
 nsuu = int(input_line)
 result = &quot;NG&quot;
 for i in range(1 , 9):
     if nsuu == (2**i):
         result = &quot;OK&quot;
         break
 print(result)


-再帰関数　階乗を求める
 def kaijyo(n):
 	if n ==0 or n == 1:
 		return 1
 	else:
 		return n * kaijyo(n-1)
 
 print(kaijyo(9)) # 362880
-random
 import random
 line = input().rstrip().split(&quot;,&quot;)  //入力例：　スライム,スライムベス,ホイミスライム,スラリン,ポイズンスライム,メタルスライム,スライムキング
 for enemy in line:
 	print(enemy + &quot;が現れた！&quot;)
 num =len(line)
 attack = random.randrange(num)
 print(line[attack]+&quot;に会心の一撃！&quot;+ line[attack] +&quot;を倒した&quot;)


-要素番号とデータを同時引き出す
 l = [&#039;Alice&#039;, &#039;Bob&#039;, &#039;Charlie&#039;]
 for i, name in enumerate(l):
     print(i, name)
 # 0 Alice
 # 1 Bob
 # 2 Charlie

-練習課題
 words = [] #話しかけられた単語を格納するリスト
 while True:
 　   word = input(&quot;何か話かけてください\n&quot;)
  　   if word == &quot;さようなら&quot;:
  　       print(&quot;さようなら&quot;)
  　       break       
 　    flg = False
 　    for w in words:
 　        if word == w:
 　            print(&quot;それ、知ってる！&quot;)
 　            flg = True
 　            break       
     if not flg: 
         words.append(word)
         print(word)
-if のみ書き直し 配列に要素が入っているかがわかる　探す文字列 in 配列
 　　    if word in words:
 　　        print(&quot;それ、知ってる！&quot;)
 　　    else:
 　　        words.append(word)
 　　        print(word)
-while
 input_line = input()
 line = input_line.split()
 
 price =  int(line[0])
 rate  = int(line[1])
 shiharai= 0
 nebiki = 0 
 while price &gt;0:
     shiharai = shiharai + price
     price = int(price - price*rate/100)
 print(shiharai)
-切り捨て、切り上げ import math
　math.floor(price - price*rate/100）    //切り捨て
 math.ceil(price - price*rate/100）      //切り上げ
-重複を削除する
 nums = [1, 2, 1, 2, 3, 2, 4, 5,]
 nums_unique = list(set(nums))
 print(nums_unique)


- 二次元の表を辞書にしてソートする
 n = int(input())
 dic ={}
 for i in range(n):
     x,y = input().split()
     x = int(x)
     dic[x] = y
 
 list = sorted(dic.items(), key=lambda x: x[0])
 for i in range(n):
     print(list[i][0],list[i][1])

-配列から重複を取り除く
 numbers = []
 for i in range(n):
     numbers.append(int(line[i]))
 
 ans = list(set(numbers))
 //numbers に入った数字の重複をsetで取り除きlistとしてansに入れる


-複数行をマージして重複を除いた上でソート
 N = int(input())
 
 A = input().split()
 B = input().split()
 
 for i in range(len(A)):
     A[i] = int(A[i])
     B[i] = int(B[i])
 
 c = set(A + B)
 
 print(&quot; &quot;.join(map(str, sorted(c))))
 #3
 #1 2 3
 #3 4 5
　#1 2 3 4 5
***関数
- 引数のデフォルト値 引数が設定されていない場合に使用される。
 def introduce(greeting, name = &quot;村人&quot;):
     print(&quot;私は&quot; + name + &quot;です。&quot; + greeting)
 
 introduce(&quot;こんにちは&quot;, &quot;勇者&quot;)
 introduce(&quot;こんにちは&quot;)
-可変長引数　複数の引数を受け取れる。それをどうするかは関数内の設定。この場合はループしてすべて出力
 def introduce(greeting, *names):
     for name in names:
         print(&quot;私は&quot; + name + &quot;です。&quot; + greeting)
 
 introduce(&quot;こんにちは&quot;, &quot;勇者&quot;, &quot;村人&quot;, &quot;兵士&quot;)

-日付関数
 from datetime import datetime, timedelta, timezone
 
 jst   = timezone(timedelta(hours=9))
 today = datetime.now(jst) 
 print(today)
 print(today.year)
 print(today.month)
 print(today.day)

***例外処理
-try except
 import sys
 try:
     key = int(input(&quot;探す値を入力してください\n&quot;))
 except:
     print(&quot;input is not numeric&quot;)
     sys.exit()    </description>
    <dc:date>2024-09-30T14:49:32+09:00</dc:date>
    <utime>1727675372</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/note4recurrent/pages/41.html">
    <title>VBA_app</title>
    <link>https://w.atwiki.jp/note4recurrent/pages/41.html</link>
    <description>
      Option Explicit
Type keisan
    saveName As String &#039;保存名
    payW As String &#039;時給1・月給２
    choiceAge As String &#039;年齢区分
    workT As Integer &#039;時間
    payH As Long &#039;時給（交通費なし）
    payM As Long  &#039;月給（交通費なし）：時給の場合はpayH×workT
    transport As Integer &#039;交通費
    remuneration As Long  &#039;月額報酬　月給の場合はそのまま、時給の場合は時給×単価＋交通費
    health As Long  &#039;健康保険
    welfare As Long  &#039;厚生年金
    care As Long  &#039;介護保険
    job As Long  &#039;雇用保険
End Type

Sub 社会保険料算出_Click()
    &#039;時給か月収が選択されていない場合
    Dim choiceHM  As String
        choiceHM = Cells(7, 4).Value
        If choiceHM = &quot;&quot; Then
            MsgBox &quot;時給もしくは月給を選択してください。&quot;
            Exit Sub
        End If
    
    Dim choiceAge As String
        choiceAge = Cells(7, 6).Value
        If choiceAge = &quot;&quot; Then
            MsgBox &quot;年齢を選択してください。&quot;
            Exit Sub
        End If

    Dim hour As Integer
    Dim transport As Long
    Dim splInput As Long
    Dim payInput As Long

    &#039;入力値が数値じゃない場合メッセージを表示する。
    If Not IsNumeric(Cells(5, 8)) Or Not IsNumeric(Cells(5, 12)) Or Not IsNumeric(Cells(5, 16)) Or Not IsNumeric(Cells(7, 16)) Then
        MsgBox &quot;数字を入力してください。&quot;
        Exit Sub
    End If

    &#039;入力値＝変数
    If Cells(7, 6) = 1 Then
        choiceAge = &quot;３９歳以下&quot;
    Else
        choiceAge = &quot;４０歳以上&quot;
    End If
    transport = Cells(7, 16).Value
    splInput = Cells(5, 12).Value
    payInput = Cells(5, 16).Value
    &#039;勤務時間　入力がなければ１６０時間とする
    If Cells(5, 8) = 0 Then
        hour = 160
    Else
        hour = Cells(5, 8)
    End If
    
    &#039;年齢、支給額、入金額が未入力の場合メッセージを出す
   If splInput = 0 Or payInput = 0 Then
        If choiceHM = &quot;1&quot; Then
            hour = 0
        End If
        MsgBox &quot;入力してください。&quot;
        Exit Sub
    End If

    ActiveSheet.Unprotect

    &#039;保険料シートのため
    Dim i As Integer
    Dim j As Integer
    
    Dim payH As Long &#039;時給（交通費なし）
    Dim payM As Long  &#039;月給（交通費なし）
    Dim splH As Long  &#039;月の入金額
    Dim splM As Long  &#039;時間の入金額
    Dim remuneration As Long  &#039;月額報酬
    Dim health As Long  &#039;健康保険
    Dim welfare As Long  &#039;厚生年金
    Dim care As Long  &#039;介護保険
    Dim job As Long  &#039;雇用保険
    Dim total As Long  &#039;保険合計＝健康保険＋厚生年金＋介護保険＋雇用保険
    Dim cost As Long  &#039;経費合計（交通費有）＝保険合計＋月額報酬
    Dim costNoTransport As Long  &#039;経費合計（交通費無）＝保険合計＋月給
    Dim del As Long  &#039;差額（交通費有）＝入金額ー経費合計（交通費有）
    Dim delNoTransport As Long  &#039;差額（交通費無）＝入金額ー経費合計（交通費無）

    &#039;menuにメニュー、datasheetに保険料
    Dim menu As Worksheet
    Set menu = ThisWorkbook.Worksheets(&quot;メニュー&quot;)
    Dim datasheet As Worksheet
    Set datasheet = ThisWorkbook.Worksheets(&quot;保険料&quot;)

    &#039;保存用
    Range(&quot;F19&quot;).Value = choiceAge
    Range(&quot;G19&quot;).Value = hour
    Range(&quot;H19&quot;).Value = transport

    &#039;時給の時
    If choiceHM = 1 Then
        splH = splInput
        splM = splH * hour
        Range(&quot;I19&quot;).Value = splM
    
        &#039;支給金額を計算
        For i = -2 To 2
            &#039;時給が－100円、－50円、0円、50円、＋100円のパターンを表示
            payH = payInput + i * 50
            Cells(14 + i, 10).Value = payH
            &#039;報酬月給（時給×月の勤務時間＋交通費）
            payM = Cells(14 + i, 10).Value * hour
            remuneration = payM + transport
            Cells(14 + i, 11).Value = remuneration
    
            &#039;保険料シートを上から回す
            For j = 6 To 55
    
                &#039;「保険料」の報酬月額（以上）＜月給＜「保険料」の報酬月額（未満）
                If datasheet.Cells(j, 3).Value &lt;= remuneration And remuneration &lt; datasheet.Cells(j, 4) Then
    
                    &#039;健康保険
                    health = datasheet.Cells(j, 6).Value
                    Cells(14 + i, 12) = health
                    &#039;厚生年金
                    welfare = datasheet.Cells(j, 9).Value
                    Cells(14 + i, 13) = welfare
                    &#039;介護保険
                    If choiceAge = &quot;３９歳以下&quot; Then
                        care = 0
                    Else
                        care = datasheet.Cells(j, 7).Value
                    End If
                    Cells(14 + i, 14).Value = care
                    &#039;雇用保険
                    job = Round((Cells(14 + i, 11).Value / 160), 0)
                    Cells(14 + i, 15).Value = job
                    &#039;保険合計
                    total = health + welfare + care + job
                    Cells(14 + i, 16).Value = total
    
                    &#039;経費合計（交通費有）＝保険合計＋月額報酬
                    cost = total + remuneration
                    Cells(14 + i, 17).Value = cost
    
                    &#039;経費合計（交通費無）＝保険合計＋月給
                    costNoTransport = total + payM
                    Cells(14 + i, 18).Value = costNoTransport
    
                    &#039;差額（交通費有）＝時給＊１６０－経費合計（交通費有）
                    del = splM - cost
                    Cells(14 + i, 19).Value = del
    
                    &#039;差額（交通費なし）＝時給＊１６０－経費合計（交通費無）
                    delNoTransport = splM - costNoTransport
                    Cells(14 + i, 20).Value = delNoTransport
                    Exit For
                End If
            Next
        Next
    &#039;月給の時
    Else
        splM = splInput
        splH = Round((splM / hour), 0)
        Range(&quot;I19&quot;).Value = splM
    
        For i = -2 To 2
            &#039;報酬月額が－10000円、－5000円、0円、＋5000円、＋10000円のパターンを表示
            payM = payInput + i * 5000
            remuneration = payM + transport
            Cells(14 + i, 11).Value = remuneration
    
            &#039;時給（１６０時間として計算）交通費無
            payH = Round(((payM + i * 5000) / hour), 0)
            Cells(14 + i, 10).Value = payH
        
            &#039;保険料シートを上から回す
            For j = 6 To 55
    
                &#039;「保険料」の報酬月額（以上）＜＝月給＜「保険料」の月額報酬（未満）
                If datasheet.Cells(j, 3).Value &lt;= remuneration And remuneration &lt; datasheet.Cells(j, 4) Then
                    &#039;健康保険
                    health = datasheet.Cells(j, 6).Value
                    Cells(14 + i, 12) = health
                    &#039;厚生年金
                    welfare = datasheet.Cells(j, 9).Value
                    Cells(14 + i, 13) = welfare
                    &#039;介護保険
                    If choiceAge = &quot;３９歳以下&quot; Then
                        care = 0
                    Else
                        care = datasheet.Cells(j, 7).Value
                    End If
                    Cells(14 + i, 14).Value = care
                    &#039;雇用保険（報酬月額＊0.006）
                    job = Round((Cells(14 + i, 11).Value / 160), 0)
                    Cells(14 + i, 15).Value = job
                    &#039;保険合計
                    total = health + welfare + care + job
                    Cells(14 + i, 16).Value = total
                    &#039;経費合計（交通費有）＝保険合計＋月額報酬
                    cost = total + remuneration
                    Cells(14 + i, 17).Value = cost
                    &#039;経費合計（交通費無）＝保険合計＋月給
                    costNoTransport = total + payM
                    Cells(14 + i, 18).Value = costNoTransport
                    &#039;差額（交通費有）＝時給＊１６０－経費合計（交通費有）
                    del = splM - cost
                    Cells(14 + i, 19).Value = del
                    &#039;差額（交通費無）＝時給＊１６０－経費合計（交通費無）
                    delNoTransport = splM - costNoTransport
                    Cells(14 + i, 20).Value = delNoTransport
    
                    Exit For
                End If
            Next
        Next
    End If

    ActiveSheet.Protect

End Sub

Sub 時給_Click()
&#039;   written by Kinami 2011/11

    ActiveSheet.Unprotect

    Cells(5, 11).Value = &quot;時給&quot;
    Cells(5, 15).Value = &quot;時給&quot;
    Cells(5, 12).Value = 0

    &#039;時給ははじめ１６０時間で設定
    Range(&quot;H5&quot;).Value = 160
    
    Range(&quot;K6:Q6&quot;).Font.ColorIndex = 1
    
    ActiveSheet.Protect

End Sub

Sub 月給_Click()
&#039;   written by Kinami 2011/11

    ActiveSheet.Unprotect
    
    Cells(5, 11).Value = &quot;月給&quot;
    Cells(5, 15).Value = &quot;月給&quot;
    Cells(5, 12).Value = 0
    Range(&quot;H5&quot;).Value = 160
    Range(&quot;K6:Q6&quot;).Font.ColorIndex = 2
    
    ActiveSheet.Protect

End Sub

Sub クリア_Click()
&#039;   written by Kinami 2011/11

    ActiveSheet.Unprotect

    Range(&quot;F5&quot;).ClearContents  &#039;年齢
    Range(&quot;H5&quot;).ClearContents  &#039;勤務時間
    Range(&quot;L5&quot;).ClearContents  &#039;入金額
    Range(&quot;P7&quot;).ClearContents  &#039;交通費
    Range(&quot;F11&quot;).ClearContents  &#039;保存名

    &#039;計算結果をクリア
    Range(&quot;j12:T16&quot;).ClearContents
    
    &#039;画面遷移時は時給計算の設定にしておく
    Range(&quot;D7&quot;).Value = 1
    Call 時給_Click
    
    ActiveSheet.Protect
    Range(&quot;L5&quot;).Select

End Sub

Sub save2db()
&#039;================このコードは　支給計算シートで実行される
&#039;   written by Kasahara 2011/11/16
    Application.ScreenUpdating = False      &#039;画面描画の停止
    &#039;算出履歴
    Dim resultSheet As Worksheet
    Set resultSheet = ThisWorkbook.Worksheets(&quot;算出履歴&quot;)
    &#039;支給計算
    Dim calcSheet As Worksheet
    Set calcSheet = ThisWorkbook.Worksheets(&quot;支給計算&quot;)

 &#039;算出されていない場合はメッセージを出す
    If Cells(14, 10) = &quot;&quot; Then
        MsgBox &quot;算出してください。&quot;
        Exit Sub
    ElseIf Cells(5, 12) = 0 Or Cells(5, 12) = &quot;&quot; Then
        MsgBox &quot;データを入力し、算出を行ってください。&quot;
        Exit Sub
    ElseIf Cells(11, 6) = &quot;&quot; Then
        MsgBox &quot;保存名を入力してください&quot;
        Exit Sub
    ElseIf Cells(5, 12).Value &gt; 10000 And Cells(7, 4).Value = 1 Then
        MsgBox &quot;時給10,000超過。要修正。&quot;
        Exit Sub
    ElseIf Cells(5, 12).Value &lt; 10000 And Cells(7, 4).Value = 2 Then
        MsgBox &quot;月給10,000未満。要修正。&quot;
        Exit Sub
    End If
    
    &#039;       ＝＝＝＝＝＝＝＝＝＝＝＝＝再計算　念のために計算を実行
    Call 社会保険料算出_Click
    
    ActiveSheet.Unprotect
&#039;       ========================重複のチェック
    Dim saveName As String
    saveName = Range(&quot;F11&quot;).Value
    
    Dim kari As Variant
    kari = readData(saveName)
    
    If kari(0, 0) &lt;&gt; &quot;nodata&quot; Then  &#039;DB に該当のデータがあるか確認
        Call MsgBox(&quot;既に使われた保存名です。変更して保存してください。&quot;)
        ActiveSheet.Protect
        Exit Sub
    End If
&#039;       ========================DBにinsert
    
    Dim str As String                                         &#039;SQL文を入れる変数
    str = makeSQL(&quot;insert&quot;)                               &#039;SQL文生成
    execSQL (str)                                               &#039;insert実行

&#039;       ＝＝＝＝＝＝＝＝＝＝＝＝＝履歴データダウンロード・転記
    Cells(1, 1).Value = &quot;save&quot;                              &#039; save モードであることを記録しておく（writeData で使う）
    Call loadHist
    calcSheet.Activate
    Cells(1, 1).Value = &quot;&quot;                                      &#039;消しておく
    ActiveSheet.Protect          &#039;支給計算
    calcSheet.Range(&quot;F11&quot;).Select
    
End Sub
Sub loadData()
&#039;================このコードは　支給計算シートで実行される
&#039;   written by Kasahara 2011/11/21
    Application.ScreenUpdating = False      &#039;画面描画の停止
 &#039;保存名がない場合はエラー
    If Cells(11, 6) = &quot;&quot; Then
        MsgBox &quot;保存名を入力してください&quot;
        Exit Sub
    End If
    ActiveSheet.Unprotect
&#039;       ========================保存名を使って検索
    Dim saveName As String
    saveName = Range(&quot;F11&quot;).Value
    
    Dim rData As Variant                &#039;検索結果を受ける変数
    rData = readData(saveName)
    
    If rData(0, 0) = &quot;nodata&quot; Then  &#039;select の結果データがなかった
        Call MsgBox(&quot;保存名が見当たりません。修正して再度実行してください。&quot;)
        ActiveSheet.Protect
        Exit Sub
    End If
    
&#039;   ＝＝＝＝＝＝＝＝＝＝＝＝＝社会保険計算に必要なデータをセルに入れる
&#039;                                           受け取ったデータを変数に代入（扱い易いように）
    Dim h As keisan
    h.saveName = rData(0, 0)
    h.payW = rData(1, 0)
    h.choiceAge = rData(2, 0)
    h.workT = rData(3, 0)
    h.payH = rData(4, 0)
    h.payM = rData(5, 0)
    h.transport = rData(6, 0)
&#039;                                             セルに入れる
    Cells(11, 6).Value = h.saveName
    Cells(7, 4).Value = h.payW
    If h.choiceAge = &quot;３９歳以下&quot; Then
        Cells(7, 6).Value = 1
    Else
        Cells(7, 6).Value = 2
    End If
    Cells(5, 8).Value = h.workT
    If h.payW = 1 Then
        Call 時給_Click
        Cells(5, 12).Value = h.payH
    Else
        Call 月給_Click
        Cells(5, 12).Value = h.payM
    End If
    Cells(7, 16).Value = h.transport
   
&#039;       ＝＝＝＝＝＝＝＝＝＝＝＝＝再計算
    Call 社会保険料算出_Click
    
    Range(&quot;F11&quot;).Select
    ActiveSheet.Protect          &#039;支給計算
    
End Sub

Sub updateData()
&#039;================このコードは　支給計算シートで実行される
&#039;   written by Kasahara 2011/11/21
        Application.ScreenUpdating = False      &#039;画面描画の停止
    &#039;算出履歴
    Dim resultSheet As Worksheet
    Set resultSheet = ThisWorkbook.Worksheets(&quot;算出履歴&quot;)
    &#039;支給計算
    Dim calcSheet As Worksheet
    Set calcSheet = ThisWorkbook.Worksheets(&quot;支給計算&quot;)

 &#039;算出されていない場合はメッセージを出す
    If Cells(14, 10) = &quot;&quot; Then
        MsgBox &quot;算出してください。&quot;
        Exit Sub
    ElseIf Cells(5, 12) = 0 Or Cells(5, 12) = &quot;&quot; Then
        MsgBox &quot;データを入力し、算出を行ってください。&quot;
        Exit Sub
    ElseIf Cells(11, 6) = &quot;&quot; Then
        MsgBox &quot;保存名を入力してください&quot;
        Exit Sub
    ElseIf Cells(5, 12).Value &gt; 10000 And Cells(7, 4).Value = 1 Then
        MsgBox &quot;時給10,000超過。要修正。&quot;
        Exit Sub
    ElseIf Cells(5, 12).Value &lt; 10000 And Cells(7, 4).Value = 2 Then
        MsgBox &quot;月給10,000未満。要修正。&quot;
        Exit Sub
    End If
    
    &#039;       ＝＝＝＝＝＝＝＝＝＝＝＝＝再計算　念のために計算を実行
    Call 社会保険料算出_Click
    
    ActiveSheet.Unprotect
&#039;       ========================重複のチェック
    Dim saveName As String
    saveName = Range(&quot;F11&quot;).Value
    
&#039;       ========================保存名を使って検索:保存名を書き換えていないかチェック
  
    Dim rData As Variant                &#039;検索結果を受ける変数
    rData = readData(saveName)
    
    If rData(0, 0) = &quot;nodata&quot; Then  &#039;select の結果データがなかった
        Call MsgBox(&quot;保存名が見当たりません。修正して再度実行してください。&quot;)
        ActiveSheet.Protect
        Exit Sub
    End If
    
&#039;       ========================　　　既存データをupdate
    
    Dim str As String                                         &#039;SQL文を入れる変数
    str = makeSQL(&quot;update&quot;)                             &#039;SQL生成
    execSQL (str)                                               &#039;update実行

&#039;       ＝＝＝＝＝＝＝＝＝＝＝＝＝履歴データダウンロード・転記
    Cells(1, 1).Value = &quot;update&quot;                           &#039;update モードであることを記録しておく（writeData で使う）
    Call loadHist

    calcSheet.Activate
    ActiveSheet.Protect                                         &#039;支給計算
    Cells(1, 1).Value = &quot;&quot;                                      &#039;消しておく
    calcSheet.Range(&quot;F11&quot;).Select
    
End Sub

Function readData(ByVal saveName As String) As Variant
&#039;   written by Kasahara 2011/11/17
&#039;  指定された一件のデータのみを読み込む。ない場合はその旨を返す。

&#039;＝＝＝＝＝＝＝＝＝＝＝＝＝＝DB接続
    Dim db      As ADODB.connection     &#039;アクセス用のオブジェクト宣言
    Dim openFl  As Boolean
    openFl = False                      &#039;オープンフラグ
    
    &#039;エラー処理の宣言
    On Error GoTo ErrorHandler
    
    If db Is Nothing Then                   &#039;インスタンスが存在しない場合
        Set db = New ADODB.connection       &#039;インスタンス生成
        openFl = True                       &#039;オープンフラグをTrue
    Else    &#039;オブジェクトが存在する場合
        If db.State = adStateClosed Then    &#039;コネクション状態がクローズの場合
            openFl = True                   &#039;オープンフラグオン
        End If
    End If
    
    If openFl = True Then                   &#039;オープンフラグがオンの場合 DB に接続
        db.Open &quot;Provider=SQLOLEDB;&quot; &amp; _
            &quot;Data Source=MC27;&quot; &amp; _
            &quot;Initial Catalog= test;&quot; &amp; _
            &quot;User Id=sa;&quot; &amp; _
            &quot;Password=MandC_mc27;&quot;
    &#039;    Call MsgBox(&quot;接続されました&quot;, vbInformation)
    End If
    
    &#039;＝＝＝＝＝＝＝＝＝＝＝＝＝＝SQL実行
    
    Dim rs   As ADODB.Recordset             &#039;SQLにアクセスするオブジェクト宣言
    Set rs = New ADODB.Recordset            &#039;インスタンス生成
    
    rs.ActiveConnection = db                &#039;dbの接続をrsのActivConnectionにセット
    
    &#039;データ取得SQL文をrsにセット
    rs.Source = &quot;SELECT &quot; &amp; _
                &quot;  * &quot; &amp; _
                &quot;FROM &quot; &amp; _
                &quot; hoken  &quot; &amp; _
                &quot; WHERE &quot; &amp; _
                &quot; saveName =  &#039;&quot; &amp; _
                  saveName &amp; &quot;&#039; ; &quot;
                  
    rs.Open                                 &#039;SQL実行(select)
    Dim notdata(1, 1) As Variant
    notdata(0, 0) = &quot;nodata&quot;
    If rs.EOF = True Then                   &#039;データが存在しない場合はnotdataを返り値に入れる
        readData = notdata
    Else                                               &#039;データが存在する場合は読んだデータを返り値に入れる
        readData = rs.GetRows
    End If

    &#039;＝＝＝＝＝＝＝＝＝＝＝＝SQLの後処理
    rs.Close                                &#039;レコードセットクローズ
    Set rs = Nothing                        &#039;rsを破棄
    If Not db Is Nothing Then               &#039;オブジェクトが存在する場合
        &#039;コネクション状態がオープンの場合
        If db.State = adStateOpen Then
            db.Close                        &#039;DBクローズ
        End If
        Set db = Nothing                    &#039;オブジェクト破棄
    End If

Exit Function

&#039;エラーの場合
ErrorHandler:
    Call MsgBox(&quot;エラー&quot; &amp; Err.Number &amp; Chr(13) &amp; Err.Description, vbCritical)
    
End Function
Sub execSQL(str As String)
&#039;   written by Kasahara 2011/11/16
&#039;　update,delete,insert で使える

&#039;＝＝＝＝＝＝＝＝＝＝＝＝＝＝DB接続
    Dim i As Integer
    Dim openFl  As Boolean
    openFl = False                      &#039;オープンフラグ
    Dim db      As ADODB.connection     &#039;アクセス用のオブジェクト宣言
    
    &#039;エラー処理の宣言
    On Error GoTo ErrorHandler
    
    If db Is Nothing Then                   &#039;インスタンスが存在しない場合
        Set db = New ADODB.connection       &#039;インスタンス生成
        openFl = True                       &#039;オープンフラグをTrue
    Else    &#039;オブジェクトが存在する場合
        If db.State = adStateClosed Then    &#039;コネクション状態がクローズの場合
            openFl = True                   &#039;オープンフラグオン
        End If
    End If
    
    If openFl = True Then                   &#039;オープンフラグがオンの場合 DB に接続
        db.Open &quot;Provider=SQLOLEDB;&quot; &amp; _
            &quot;Data Source=MC27;&quot; &amp; _
            &quot;Initial Catalog= test;&quot; &amp; _
            &quot;User Id=sa;&quot; &amp; _
            &quot;Password=MandC_mc27;&quot;
    &#039;    Call MsgBox(&quot;接続されました&quot;, vbInformation)
    End If
    
    &#039;＝＝＝＝＝＝＝＝＝＝＝＝＝＝SQL実行
     db.Execute str
    
    &#039;＝＝＝＝＝＝＝＝＝＝＝＝＝＝SQLの後処理
    If Not db Is Nothing Then               &#039;オブジェクトが存在する場合
    &#039;コネクション状態がオープンの場合
        If db.State = adStateOpen Then
            db.Close                        &#039;DBクローズ
        End If
        Set db = Nothing                    &#039;オブジェクト破棄
    End If
Exit Sub

&#039;エラーの場合
ErrorHandler:
    Call MsgBox(&quot;エラー&quot; &amp; Err.Number &amp; Chr(13) &amp; Err.Description, vbCritical)
End Sub
Function makeSQL(syori As String) As String
&#039;   written by Kasahara 2022/11/16      insert 文作成
&#039;   modified by Kasahara 2022/11/22   update 追加
&#039;
    Dim iStr    As String       &#039;SQL文
    Dim d As keisan
    
&#039;   シートからデータを取り込む
    d.saveName = Range(&quot;F11&quot;).Value
    d.payW = Range(&quot;D7&quot;).Value
    d.choiceAge = Range(&quot;F19&quot;).Value &#039;年齢
    d.workT = Range(&quot;G19&quot;).Value       &#039;時間
    If Cells(7, 4).Value = 1 Then
        d.payH = Cells(14, 10).Value  &#039;時給（交通費無）
        d.payM = d.payH * d.workT      &#039;月給（交通費無）
    Else
        d.payM = Cells(5, 12).Value  &#039;月給（交通費無）
        d.payH = Round(d.payM / d.workT, 0)
    End If
    d.transport = Cells(7, 16).Value &#039;交通費
    d.remuneration = Cells(14, 11).Value    &#039;月額報酬
    d.health = Range(&quot;L14&quot;).Value    &#039;健康保険
    d.welfare = Range(&quot;M14&quot;).Value    &#039;厚生年金
    d.care = Range(&quot;N14&quot;).Value    &#039;介護保険
    d.job = Range(&quot;O14&quot;).Value     &#039;雇用保険
    If syori = &quot;insert&quot; Then
    &#039;   insert 文作成
        iStr = &quot;INSERT INTO hoken&quot; &amp; _
                &quot;(saveName, payW,choiceAge,workT,payH,payM,transport,remuneration,health,welfare,care,job) values (&quot;
        iStr = iStr &amp; &quot;&#039;&quot; &amp; d.saveName &amp; _
                &quot;&#039;,&quot; &amp; d.payW &amp; _
                &quot;,&#039;&quot; &amp; d.choiceAge &amp; _
                &quot;&#039;,&quot; &amp; d.workT &amp; _
                &quot;,&quot; &amp; d.payH &amp; _
                &quot;,&quot; &amp; d.payM
         iStr = iStr &amp; &quot;,&quot; &amp; d.transport &amp; _
                &quot;,&quot; &amp; d.remuneration &amp; _
                &quot;,&quot; &amp; d.health &amp; _
                &quot;,&quot; &amp; d.welfare &amp; _
                &quot;,&quot; &amp; d.care &amp; _
                &quot;,&quot; &amp; d.job &amp; _
                &quot;);&quot;
    Else
    &#039;   update 文作成
        iStr = &quot;UPDATE hoken SET &quot;
        iStr = iStr &amp; &quot;saveName= &#039;&quot; &amp; d.saveName &amp; &quot;&#039;,&quot;
        iStr = iStr &amp; &quot; payW= &quot; &amp; d.payW &amp; &quot;,&quot;
        iStr = iStr &amp; &quot; choiceAge= &#039;&quot; &amp; d.choiceAge &amp; &quot;&#039;,&quot;
        iStr = iStr &amp; &quot; workT= &quot; &amp; d.workT &amp; &quot;,&quot;
        iStr = iStr &amp; &quot; payH= &quot; &amp; d.payH &amp; &quot;,&quot;
        iStr = iStr &amp; &quot; payM= &quot; &amp; d.payM &amp; &quot;,&quot;
        iStr = iStr &amp; &quot; transport= &quot; &amp; d.transport &amp; &quot;,&quot;
        iStr = iStr &amp; &quot; remuneration= &quot; &amp; d.remuneration &amp; &quot;,&quot;
        iStr = iStr &amp; &quot; health= &quot; &amp; d.health &amp; &quot;,&quot;
        iStr = iStr &amp; &quot; welfare= &quot; &amp; d.welfare &amp; &quot;,&quot;
        iStr = iStr &amp; &quot; care= &quot; &amp; d.care &amp; &quot;,&quot;
        iStr = iStr &amp; &quot; job= &quot; &amp; d.job &amp; &quot;,&quot;
        iStr = iStr &amp; &quot; cDate= &#039;&quot; &amp; Year(Now) &amp; &quot;-&quot; &amp; Month(Now) &amp; &quot;-&quot; &amp; Day(Now) &amp; &quot; &quot; &amp; hour(Now) &amp; &quot;:&quot; &amp; Minute(Now) &amp; &quot;:&quot; &amp; Second(Now) &amp; &quot;:000&#039;&quot;
        iStr = iStr &amp; &quot; WHERE saveName = &#039;&quot; &amp; d.saveName
        iStr = iStr &amp; &quot;&#039;;&quot;
    End If
&#039;    Stop
    makeSQL = iStr                          &#039;作ったSQL文を返り値にセット
End Function

Sub loadHist()
&#039;   written by Kasahara 2011/11/17
&#039;                                                          全データをダウンロードして履歴セルに貼り付ける
&#039;＝＝＝＝＝＝＝＝＝＝＝＝＝＝DB接続
    Dim db      As ADODB.connection     &#039;アクセス用のオブジェクト宣言
    Dim openFl  As Boolean
    openFl = False                                  &#039;オープンフラグ
    Dim allData As Variant                       &#039;DLデータ受ける変数
    
    &#039;エラー処理の宣言
    On Error GoTo ErrorHandler
    
    If db Is Nothing Then                   &#039;インスタンスが存在しない場合
        Set db = New ADODB.connection       &#039;インスタンス生成
        openFl = True                       &#039;オープンフラグをTrue
    Else    &#039;オブジェクトが存在する場合
        If db.State = adStateClosed Then    &#039;コネクション状態がクローズの場合
            openFl = True                   &#039;オープンフラグオン
        End If
    End If
    
    If openFl = True Then                   &#039;オープンフラグがオンの場合 DB に接続
        db.Open &quot;Provider=SQLOLEDB;&quot; &amp; _
            &quot;Data Source=MC27;&quot; &amp; _
            &quot;Initial Catalog= test;&quot; &amp; _
            &quot;User Id=sa;&quot; &amp; _
            &quot;Password=MandC_mc27;&quot;
    End If
    
    &#039;＝＝＝＝＝＝＝＝＝＝＝＝＝＝SQL実行
    
    Dim rs   As ADODB.Recordset             &#039;SQLにアクセスするオブジェクト宣言
    Set rs = New ADODB.Recordset            &#039;インスタンス生成
    
    rs.ActiveConnection = db                &#039;dbの接続をrsのActivConnectionにセット
    
    &#039;テストデータ取得SQL文をrsにセット          &#039;全件取得
    rs.Source = &quot;SELECT &quot; &amp; _
                &quot;  * &quot; &amp; _
                &quot;FROM &quot; &amp; _
                &quot; hoken order by cDate desc ;&quot;

    rs.Open                                            &#039;SQL実行

    If rs.EOF = True Then                       &#039;データがない場合：理論的には存在しない
        Call MsgBox(&quot;該当データが存在しません&quot;)
        Exit Sub
    Else                                                  &#039;データが存在する場合
        allData = rs.GetRows                    &#039;GetRowsメソッドでデータを戻り値に格納)
        writeData (allData)                         &#039;ダウンロードしたデータをシートに転記
    End If
    
    &#039;＝＝＝＝＝＝＝＝＝＝＝＝＝＝SQLの後処理
    rs.Close                                &#039;レコードセットクローズ
    Set rs = Nothing                        &#039;rsを破棄
    If Not db Is Nothing Then               &#039;オブジェクトが存在する場合
        &#039;コネクション状態がオープンの場合
        If db.State = adStateOpen Then
            db.Close                        &#039;DBクローズ
        End If
        Set db = Nothing                    &#039;オブジェクト破棄
    End If

Exit Sub

&#039;エラーの場合
ErrorHandler:
    Call MsgBox(&quot;エラー&quot; &amp; Err.Number &amp; Chr(13) &amp; Err.Description, vbCritical)
    
End Sub

Sub writeData(allData As Variant)
&#039;   written by Kasahara 2011/11/17
&#039;               ダウンロードした履歴データをワークシートに転記する
&#039;   update by Kasahara 2011/11/17
&#039;               update 対応

    Dim RowSize, columnSize, i, j As Long
    Dim temp()  As Variant          &#039;縦と横を入れ替えるために使う
    
    columnSize = UBound(allData, 1)
    RowSize = UBound(allData, 2)
    ReDim temp(RowSize, columnSize) &#039;縦と横を入れ替えるための設定
    
    For i = 0 To UBound(allData, 1)
        For j = 0 To UBound(allData, 2)
            temp(j, i) = allData(i, j)
        Next j
    Next i
    
    &#039;cellに転記
    &#039;支給計算シート　（直近５件のみ
    Sheets(&quot;支給計算&quot;).Select
    ActiveSheet.Unprotect
    
    &#039;                                   どちらのモードで呼ばれたかを読み込む
    Dim flg As String
    flg = Cells(1, 1).Value
    
    For i = 1 To UBound(temp) + 1
        If i &gt; 5 Then
            Exit For
        End If
        
        Cells(i + 21, 4).Value = temp(i - 1, 12)      &#039;  保存日時
        Cells(i + 21, 5).Value = temp(i - 1, 0)      &#039;  保存名
        Cells(i + 21, 6).Value = temp(i - 1, 2)      &#039;  年齢
        Cells(i + 21, 7).Value = temp(i - 1, 3)      &#039;  時間
        Cells(i + 21, 8).Value = temp(i - 1, 6)      &#039;  交通費
        Cells(i + 21, 9).Value = temp(i - 1, 5)      &#039;  月給
        Cells(i + 21, 10).Value = temp(i - 1, 4)      &#039;  時給
        Cells(i + 21, 11).Value = temp(i - 1, 7)      &#039;  報酬月額
        Cells(i + 21, 12).Value = temp(i - 1, 8)      &#039;　健康保険
        Cells(i + 21, 13).Value = temp(i - 1, 9)      &#039;　厚生年金
        Cells(i + 21, 14).Value = temp(i - 1, 10)      &#039;　介護保険料
        Cells(i + 21, 15).Value = temp(i - 1, 11)      &#039;　雇用保険
       &#039;横計算のセル
        Cells(i + 21, 16).Value = Cells(i + 21, 12) + Cells(i + 21, 13) + Cells(i + 21, 14) + Cells(i + 21, 15)
        Cells(i + 21, 17).Value = Cells(i + 21, 16).Value + Cells(i + 21, 11).Value &#039;経費合計（交通費有）＝保険合計＋月額報酬
        Cells(i + 21, 18).Value = Cells(i + 21, 16).Value + Cells(i + 21, 9).Value  &#039;経費合計（交通費無）＝保険合計＋月給
        Cells(i + 21, 19).Value = Cells(i + 21, 9).Value - Cells(i + 21, 17).Value &#039;差額交通費有
        Cells(i + 21, 20).Value = Cells(i + 21, 11).Value - Cells(i + 21, 17).Value  &#039;差額交通費無
    Next i
    ActiveSheet.Protect
    Sheets(&quot;算出履歴&quot;).Select
    ActiveSheet.Unprotect
    For i = 1 To UBound(temp) + 1
        Cells(i + 5, 4).Value = temp(i - 1, 12)      &#039;  保存日時
        Cells(i + 5, 5).Value = temp(i - 1, 0)      &#039;  保存名
        Cells(i + 5, 6).Value = temp(i - 1, 2)      &#039;  年齢
        Cells(i + 5, 7).Value = temp(i - 1, 3)      &#039;  時間
        Cells(i + 5, 8).Value = temp(i - 1, 6)      &#039;  交通費
        Cells(i + 5, 9).Value = temp(i - 1, 5)      &#039;  月給
        Cells(i + 5, 10).Value = temp(i - 1, 4)      &#039;  時給
        Cells(i + 5, 11).Value = temp(i - 1, 7)      &#039;  報酬月額
        Cells(i + 5, 12).Value = temp(i - 1, 8)      &#039;　健康保険
        Cells(i + 5, 13).Value = temp(i - 1, 9)      &#039;　厚生年金
        Cells(i + 5, 14).Value = temp(i - 1, 10)      &#039;　介護保険料
        Cells(i + 5, 15).Value = temp(i - 1, 11)      &#039;　雇用保険
       &#039;横計算のセル
        Cells(i + 5, 16).Value = Cells(i + 5, 12) + Cells(i + 5, 13) + Cells(i + 5, 14) + Cells(i + 5, 15)
        Cells(i + 5, 17).Value = Cells(i + 5, 16).Value + Cells(i + 5, 11).Value &#039;経費合計（交通費有）＝保険合計＋月額報酬
        Cells(i + 5, 18).Value = Cells(i + 5, 16).Value + Cells(i + 5, 9).Value  &#039;経費合計（交通費無）＝保険合計＋月給
        Cells(i + 5, 19).Value = Cells(i + 5, 9).Value - Cells(i + 5, 17).Value &#039;差額交通費有
        Cells(i + 5, 20).Value = Cells(i + 5, 11).Value - Cells(i + 5, 17).Value  &#039;差額交通費無
    Next i
 
 &#039;              ＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝　update の場合は件数が変わらないので以下の処理は行わない
    If flg = &quot;save&quot; Then
        &#039;履歴の最終行に番号を追加
        Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).Value = (Cells(Rows.Count, 3).End(xlUp).Value + 1)
        Dim lastRange As Range
        Set lastRange = Range(Cells(Rows.Count, 3).End(xlUp), Cells(Rows.Count, 20).End(xlUp))
        lastRange.Offset(-1, 0).Borders(xlEdgeBottom).LineStyle = False
        lastRange.Offset(-1, 0).Copy
        lastRange.PasteSpecial Paste:=xlPasteFormats
        lastRange.Offset(-1, 0).Borders(xlEdgeBottom).LineStyle = False
        
        &#039;５行ごとに水平の罫線を上部へ追加
        If Cells(Rows.Count, 3).End(xlUp).Value Mod 5 = 1 Then
            lastRange.Borders(xlEdgeTop).LineStyle = True
            lastRange.Borders(xlEdgeTop).ColorIndex = 2
        End If
    
        &#039;最下部の罫線を追加
        lastRange.Borders(xlEdgeBottom).LineStyle = True
        lastRange.Borders(xlEdgeBottom).ColorIndex = 2
        lastRange.Borders(xlEdgeLeft).LineStyle = True
        lastRange.Borders(xlEdgeRight).LineStyle = True
    End If
    ActiveSheet.Protect          &#039;算出履歴
End Sub

Sub 以上_Click()
End Sub
Sub 以下_Click()
End Sub    </description>
    <dc:date>2022-11-22T13:15:09+09:00</dc:date>
    <utime>1669090509</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/note4recurrent/pages/40.html">
    <title>VBA_SQL_insert</title>
    <link>https://w.atwiki.jp/note4recurrent/pages/40.html</link>
    <description>
      Option Explicit

Sub update()
&#039;       一括insert
&#039;       datシートのデータからSQL文を生成し実行するただし、このプログラムでは実行はしない

Application.ScreenUpdating = False      &#039;画面描画の停止


&#039;   SQL実行
    Dim str As Variant                                          &#039;SQL文を入れる変数
    str = makeSQL()                                             &#039;SQL生成
    execSQL (str)                                               &#039;実行
    
&#039;ApplicamakeSQLtion.ScreenUpdating = True       &#039;画面描画の停止解除

End Sub

Sub execSQL(str As Variant)
&#039;＝＝＝＝＝＝＝＝＝＝＝＝＝＝DB接続
    Dim i As Integer
    Dim openFl  As Boolean
    openFl = False                      &#039;オープンフラグ
    Dim db      As ADODB.connection     &#039;アクセス用のオブジェクト宣言
    
    &#039;エラー処理の宣言
    On Error GoTo ErrorHandler
    
    If db Is Nothing Then                   &#039;インスタンスが存在しない場合
        Set db = New ADODB.connection       &#039;インスタンス生成
        openFl = True                       &#039;オープンフラグをTrue
    Else    &#039;オブジェクトが存在する場合
        If db.State = adStateClosed Then    &#039;コネクション状態がクローズの場合
            openFl = True                   &#039;オープンフラグオン
        End If
    End If
    
    If openFl = True Then                   &#039;オープンフラグがオンの場合 DB に接続
        db.Open &quot;Provider=****;&quot; &amp; _
            &quot;Data Source=****;&quot; &amp; _
            &quot;Initial Catalog= ****;&quot; &amp; _
            &quot;User Id=******;&quot; &amp; _
            &quot;Password=*******;&quot;
    &#039;    Call MsgBox(&quot;接続されました&quot;, vbInformation)
    End If
    
    &#039;＝＝＝＝＝＝＝＝＝＝＝＝＝＝SQL実行
    For i = 1 To UBound(str)
&#039;        db.Execute str(i)                   &#039;SQL実行:架空のテーブルなのでコメントを外すとエラーで落ちる
    Next i
    
    &#039;＝＝＝＝＝＝＝＝＝＝＝＝＝＝SQLの後処理
    If Not db Is Nothing Then               &#039;オブジェクトが存在する場合
    &#039;コネクション状態がオープンの場合
        If db.State = adStateOpen Then
            db.Close                        &#039;DBクローズ
        End If
        Set db = Nothing                    &#039;オブジェクト破棄
    End If
Exit Sub

&#039;エラーの場合
ErrorHandler:
    Call MsgBox(&quot;エラー&quot; &amp; Err.Number &amp; Chr(13) &amp; Err.Description, vbCritical)
End Sub

Function makeSQL() As Variant
&#039;   SQL文作成：配列にテキストを入れる
    Sheets(&quot;dat&quot;).Select
    Dim str() As String                         &#039;SQL文を入れる配列
    Dim i As Integer
    Dim TABLE As String
    TABLE = &quot;syaintable&quot;
    i = 2                                               &#039;１行目は見出しなので
    While Cells(i, 1).Value &lt;&gt; &quot;&quot;
        ReDim Preserve str(i - 1)
        str(i - 1) = &quot;insert into &quot; &amp; TABLE &amp; &quot; ( id  ,  name ,  gender ,  email )  values (&quot; _
        &amp; Cells(i, 1).Value &amp; &quot; , &#039;&quot; _
        &amp; Cells(i, 2).Value &amp; &quot;&#039; , &#039;&quot; _
        &amp; Cells(i, 3).Value &amp; &quot;&#039; , &#039;&quot; _
        &amp; Cells(i, 4).Value _
        &amp; &quot;&#039; );&quot;
         i = i + 1
   Wend
   makeSQL = str
&#039;       確認のためシートに書き出す。
    For i = 1 To UBound(str)
        Cells(i + 1, 5).Value = str(i)
    
    Next i
   
   
End Function    </description>
    <dc:date>2022-11-15T15:12:25+09:00</dc:date>
    <utime>1668492745</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/note4recurrent/pages/39.html">
    <title>VBA_lib</title>
    <link>https://w.atwiki.jp/note4recurrent/pages/39.html</link>
    <description>
      https://gomyownway.hatenablog.com/entry/2012/06/23/152950

　Sheets(&quot;Sheet2&quot;).Select
----
 　Sub runover()
 　&#039;
 　&#039; 読み飛ばし
 　&#039;A列の1行目から開始し、空白になるまで読み飛ばす
 　    Dim i As Integer
 　    i = 1
 　    While Cells(i, 1).Value &lt;&gt; &quot;&quot;
 　        i = i + 1
 　    Wend
 　    Cells(i, 1).Value = &quot;hogehoge&quot;
 　    
 　End Sub    </description>
    <dc:date>2022-11-15T15:09:31+09:00</dc:date>
    <utime>1668492571</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/note4recurrent/pages/38.html">
    <title>VBA_SQL-select</title>
    <link>https://w.atwiki.jp/note4recurrent/pages/38.html</link>
    <description>
      https://www.excellovers.com/archive/category/VBA

 Option Explicit
 
 Sub slect()
 
    &#039;SQLアクセスのFunction化
    &#039;ワークシート処理をsub化
    Application.ScreenUpdating = False      &#039;画面描画の停止
    
    Call clearSheet                                     &#039;シートのクリア
    Call writeVal(accSQL(1, 1000))              &#039;accSQLで検索した結果をwriteValでシートに転記
    
    Application.ScreenUpdating = True       &#039;画面描画の停止解除
 
 End Sub
----
 Function accSQL(ByVal startCD As Long, ByVal endCD As Long) As Variant
 &#039;   生徒コードの開始、終了の値を受けてSQLから生徒データをダウンロードする。
    &#039;＝＝＝＝＝＝＝＝＝＝＝＝＝＝DB接続
    Dim db      As ADODB.connection     &#039;アクセス用のオブジェクト宣言
    Dim openFl  As Boolean
    openFl = False                                  &#039;オープンフラグ
    
    &#039;エラー処理の宣言
    On Error GoTo ErrorHandler
    
    If db Is Nothing Then                          &#039;インスタンスが存在しない場合
        Set db = New ADODB.connection     &#039;インスタンス生成
        openFl = True                                 &#039;オープンフラグをTrue
    Else    &#039;オブジェクトが存在する場合
        If db.State = adStateClosed Then    &#039;コネクション状態がクローズの場合
            openFl = True                           &#039;オープンフラグオン
        End If
    End If
    
    If openFl = True Then                   &#039;オープンフラグがオンの場合 DB に接続
        db.Open &quot;Provider=-----;&quot; &amp; _
            &quot;Data Source=DBname;&quot; &amp; _
            &quot;Initial Catalog= tablename;&quot; &amp; _
            &quot;User Id=********;&quot; &amp; _
            &quot;Password=******;&quot;
    &#039;    Call MsgBox(&quot;接続されました&quot;, vbInformation)
    End If
    
    &#039;＝＝＝＝＝＝＝＝＝＝＝＝＝＝SQL実行
    
    Dim rs   As ADODB.Recordset             &#039;SQLにアクセスするオブジェクト宣言
    Set rs = New ADODB.Recordset            &#039;インスタンス生成
    
    rs.ActiveConnection = db                &#039;dbの接続をrsのActivConnectionにセット
    
    &#039;テストデータ取得SQL文をrsにセット
    rs.Source = &quot;SELECT &quot; &amp; _
                &quot; STUCD,SUTNMPRT,SEX,SCHOOLNM &quot; &amp; _
                &quot;FROM &quot; &amp; _
                &quot; dbo.TM_STUDENT &quot; &amp; _
                &quot; WHERE &quot; &amp; _
                &quot; STUCD between &quot; &amp; startCD &amp; &quot; and &quot; &amp; endCD &amp; &quot;  and&quot; &amp; _
                &quot; SCHOOLNM &lt;&gt;&#039;&#039;&quot;
    rs.Open                                 &#039;SQL実行
    If rs.EOF = True Then                   &#039;データが存在ない場合
        Call MsgBox(&quot;該当データが存在しません&quot;)
    Else                                    &#039;データが存在する場合
        accSQL = rs.GetRows                 &#039;GetRowsメソッドでデータを戻り値に格納)
    End If
    
    &#039;＝＝＝＝＝＝＝＝＝＝＝＝＝＝SQLの後処理
    rs.Close                                &#039;レコードセットクローズ
    Set rs = Nothing                        &#039;rsを破棄
    If Not db Is Nothing Then               &#039;オブジェクトが存在する場合
        &#039;コネクション状態がオープンの場合
        If db.State = adStateOpen Then
            db.Close                        &#039;DBクローズ
        End If
        Set db = Nothing                    &#039;オブジェクト破棄
    End If
 
 Exit Function
 
 &#039;エラーの場合
 ErrorHandler:
    Call MsgBox(&quot;エラー&quot; &amp; Err.Number &amp; Chr(13) &amp; Err.Description, vbCritical)
 End Function
----
 Sub writeVal(gotVal As Variant)
 
 &#039;gotVal のデータをセルに転記する
 &#039;SQL からダウンロードしたデータは縦と横がエクセルと逆なので、
 &#039;そのままでは範囲を指定した一括代入に向かない。
 &#039;一括代入後worksheetfuncitonで入れ替えペーストすることもできるが
 &#039;列の上限は行の上限を下回るのでデータ数が多いと入りきらない可能性がある。
 &#039;ここでは取り込んだデータを仮の配列に入れなおしてから貼り付けている。

    Dim b As Workbook
    Set b = ThisWorkbook
    Dim w As Worksheet
    Set w = b.Worksheets(1)         &#039;貼り付けるシートはここで決まる。
    Dim r As Range
    Dim RowSize, columnSize, i, j As Long
    Dim temp()  As Variant          &#039;縦と横を入れ替えるための仮の配列
    
    columnSize = UBound(gotVal, 1)
    RowSize = UBound(gotVal, 2)
    ReDim temp(RowSize, columnSize) &#039;縦と横を入れ替えるための設定
    
    For i = 0 To UBound(gotVal, 1)
        For j = 0 To UBound(gotVal, 2)
            temp(j, i) = gotVal(i, j)
        Next j
    Next i
    
    RowSize = UBound(temp, 1) + 1
    columnSize = UBound(temp, 2) + 1
        
    Set r = w.Range(&quot;A2&quot;).Resize(RowSize, columnSize)   &#039;貼り付ける範囲を設定
    
    r.Value = temp                                      &#039;シートに貼り付け
 
 End Sub
 
----
 Sub clearSheet()
 &#039;   シートのクリア
 &#039;   1行目は残している
 &#039;   特定の範囲だけを更新したい場合にはここで範囲を決めること
    Range(&quot;A2:XFD1048576&quot;).Select
    Selection.ClearContents
 
 End Sub    </description>
    <dc:date>2022-11-14T21:47:13+09:00</dc:date>
    <utime>1668430033</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/note4recurrent/pages/36.html">
    <title>SQL-2</title>
    <link>https://w.atwiki.jp/note4recurrent/pages/36.html</link>
    <description>
      --１－１
--VM_生徒基本情報を全列名検索してください。

select * from dbo.VM_生徒基本情報;

--１－２
--VM_生徒塾種情報を全列名検索してください。

select * from dbo.VM_生徒塾種情報;

--１－３
--VM_生徒受講情報を全列名検索してください。
select * from dbo.VM_生徒受講情報;

--１－４
--VM_組織マスタを全列名検索してください。
select * from dbo.VM_組織マスタ;

--１－５
--VM_クラスマスタを全列名検索してください。
select * from dbo.VM_クラスマスタ;

--１－６
--VM_生徒基本情報から、生徒コード「301～320」の
--生徒を、全列名を検索してください。
select * from dbo.VM_生徒基本情報
where 生徒コード between 301 and 320;

--１－７
--VM_生徒塾種情報から、退塾の生徒を全列名検索してください。
--＊状態区分は	1　:　塾生（塾に入塾した生徒）
--				2　:　塾外生（入塾していない生徒　※テストのみを受ける見込み客等）
--				3　:　プール生（次年度入塾予定の生徒）
--				4　:　退塾（入塾後、塾を辞めた生徒）
--				5　:　休塾（入塾後、様々な事情で一定期間塾をお休みする生徒）
--				6　:　既卒（入塾し、卒塾(浜学園は小1～小6まで）した生徒)
--　　　		です。
select * from dbo.VM_生徒塾種情報
where 状態区分 = 4;

--８
--M_生徒受講情報から、受講年度が　　  2014年　かつ、
--講座コードが　      5100　  かつ、
--教室コードが　   　 201　  かつ
--現在受講中 の生徒を全列名検索してください。
--「現在受講中」とは、開始日列がNULL以外、終了日列がNULLの状態を指します。
select * from dbo.VM_生徒受講情報
where 受講年度 = 2014 and 講座コード = 5100 and 教室コード = 201 and
	 開始日 is not null and 終了日 is null;

--１－９
--	VM_組織マスタの塾種区分が1　かつ、組織タイプが3かつ、
--組織KEY「850」「701」以外 の
--列名：
--　組織KEY     → 教室コード、
--  組織名略称1 → 教室名、
--  組織名略称3を検索してください。
select 組織KEY as 教室コード,組織名略称1 as 教室名,組織名略称3 from dbo.VM_組織マスタ
where	塾種区分 = 1 and
		組織タイプ = 3 and
		組織KEY not in (850,701);

--１－１０
--	VM_クラスマスタの　教室コードが101　かつ、学年コードが6の
--	列名：クラスコード　　 →　クラス、
--クラス名称帳票用 →　クラス名称、
--大クラスコード、
--クラスコード　     を検索してください

select クラスコード as クラス,クラス名称帳票用 as クラス名称, 大クラスコード,クラスコード
from dbo.VM_クラスマスタ
where 教室コード = 101 and
		学年コード = 6;

--２－１
--	VM_生徒基本情報より、飛び級生の生徒を抽出してください。
--	※飛び級生は　生徒帳票用氏名に「＊」が付いています。ヒント：LIKE句
select * from dbo.VM_生徒基本情報
where	生徒帳票用氏名 like &#039;%＊%&#039;;

--２－２
--２－１で抽出した生徒を、「女子」、次に「男子」の順に並べ替えて、さらに、
--生徒氏名カナ_半角の昇順で表示してください。
--※性別　１：男　２：女　
select * from dbo.VM_生徒基本情報
where	生徒帳票用氏名 like &#039;%＊%&#039;
order by 性別 desc, 生徒氏名カナ_半角;

--２－３
--	VM_生徒塾種情報より、塾外生、退塾、既卒以外の生徒を抽出してください。
--		[列名]　状態区分	 ：生徒の状態
--（区分のコードは「001_1_課題１.doc」の１－７参照）
--		　　　　塾生コード	 ：塾生ｺｰﾄﾞ
--			所属教室コード ：教室コード
--	※塾種区分は’1’で指定してください。

select 状態区分 as 生徒の状態,塾生コード as 塾生ｺｰﾄﾞ , 所属教室コード as 教室コード from dbo.VM_生徒塾種情報
where 状態区分 not in (2,4,6) and 
		塾種区分 = 1 ;

--２－４
--２－３で抽出した生徒を、所属教室コードの昇順、状態区分の降順に並べ替えてください。
--	[列名] 教室コード
--		生徒の状態
--		塾生ｺｰﾄﾞ
select 所属教室コード as 教室コード,状態区分 as 生徒の状態,塾生コード as 塾生ｺｰﾄﾞ  from dbo.VM_生徒塾種情報
where 状態区分 not in (2,4,6) and 
		塾種区分 = 1 
order by 所属教室コード,状態区分 desc;


--２－５
--２－４で抽出した生徒を、所属教室単位の状態区分単位に集約してください。
select 所属教室コード as 教室コード,状態区分 as 生徒の状態,塾生コード as 塾生ｺｰﾄﾞ  from dbo.VM_生徒塾種情報
where 状態区分 not in (2,4,6) and 
		塾種区分 = 1 
group by 所属教室コード,状態区分,塾生コード
order by 所属教室コード,状態区分 desc;


--２－６
--VM_生徒基本情報を検索。生年月日　2001年4月2日以降、
--かつ、飛び級生（生徒帳票用氏名に「＊」が入っている生徒）の生徒を
--性別降順、生徒コードの昇順の並びで、
--[列名] ‘飛び級生’　AS　塾種名称　
--生徒帳票用氏名
--生年月日
--生徒コード

select &#039;飛び級生&#039;　AS　塾種名称,生徒帳票用氏名,生年月日,生徒コード from dbo.VM_生徒基本情報
where	生徒帳票用氏名 like &#039;%＊%&#039; and 
		生年月日 &gt;= 2001-04-02
order by 性別 desc, 生徒コード;

	
--２－７
--VT_テスト生徒得点情報を検索。第467回公開学力テストを受験者した５年生の中から、
--教室コード降順、得点降順で全列名検索してください。
--[条件] 情報種別区分	＝	1(イベントテスト)
--		PKEY		＝	262(467回公開学力テスト)
--　　　　　　　※Pkyeが何かを調べる場合は、VT_テスト情報ＨＤで検索。
--		科目コード	＝	2(算数)
--		単元コード	＝	2(算数)
--　　　学年コード　　＝　　 5

select * from dbo.VT_テスト生徒得点情報 as a
where	情報種別区分	=	1 and
		PKEY		=	262 and
		科目コード	=	2 and
		単元コード	=	2 and
  　　　学年コード　=　 5
order by	教室コード desc , 得点 desc;

--２－８
--VT_テスト生徒成績集計情報を検索。第467・468・469・470回公開学力テスト受験者、
--かつ、５年生、受験教室は西大寺(=401)、回数の昇順、で全列名検索してください。
--※教室のコードを調べる場合は、VM_組織マスタで塾種区分=1、組織タイプ=3で参照。
--[条件] 情報種別区分	＝	1
--		PKEY		＝	※VT_テスト情報ＨＤより、情報種別区分=1、
--　　　　　　　　　　　　　　　　　 　回数=(該当回数)で検索してください。
--		テスト集計区分＝	1
--		科計区分	＝	3
--		型NO		＝	2
--　　　学年コード　　＝　　 5
--　　　受験教室コード＝　　 401

select * from dbo.VT_テスト生徒成績集計情報 as a
where	情報種別区分 = 1 and
		テスト集計区分 = 1 and
		科計区分 = 3 and
		型NO = 2 and
		学年コード = 5 and
		受験教室コード = 401 and
		a.Pkey in (select Pkey from dbo.VT_テスト情報ＨＤ as k
					where 回数 in (467,468,469,470));

--２－９
--	２－８の抽出結果を使用し、教室コードが西大寺教室(401)の生徒を、
--回数単位、大クラスコード単位に集約し、回数の昇順、大クラスコードの昇順で並び替え、
--[列名] 集約教室　値＝‘西大寺教室’
--	回数		
--	大クラスコード　：L_CLASS
--	COUNT(*)	AS	集計
--		を抽出してください

select   &#039;西大寺教室&#039; as 集約教室, 回数, 大クラスコード as L_CLASS ,count(*) as 集計　
from dbo.VT_テスト生徒成績集計情報
where	情報種別区分 = 1 and
		テスト集計区分 = 1 and
		科計区分 = 3 and
		型NO = 2 and
		学年コード = 5 and
		受験教室コード = 401 and 
		Pkey in (select Pkey from dbo.VT_テスト情報ＨＤ
					where 回数 in (467,468,469,470))
group by 回数,大クラスコード
order by 回数,大クラスコード

--３－１
--「VM_生徒塾種情報」テーブル使用
--現在【塾生、塾外生、ﾌﾟｰﾙ生、退塾、休塾、既卒】それぞれの生徒の人数を検索して下さい。
--[列名] 状態区分、人数　の２つです。※状態区分については、課題１の７を参照。

--VM_生徒塾種情報から、退塾の生徒を全列名検索してください。
--＊状態区分は	1　:　塾生（塾に入塾した生徒）
--				2　:　塾外生（入塾していない生徒　※テストのみを受ける見込み客等）
--				3　:　プール生（次年度入塾予定の生徒）
--				4　:　退塾（入塾後、塾を辞めた生徒）
--				5　:　休塾（入塾後、様々な事情で一定期間塾をお休みする生徒）
--				6　:　既卒（入塾し、卒塾(浜学園は小1～小6まで）した生徒)
--　　　		です。

select 状態区分,count(*) as 人数 
from dbo.VM_生徒塾種情報
where 状態区分 &lt;&gt; 0
group by 状態区分;

--３－２
--	３－１で抽出したデータをさらに分かりやすくする為に、
--	状態区分　1　なら　塾生　というように、「状態名称」の[列名]を追加して下さい。

select  状態区分,
		case 
		when 状態区分 = 1 then &#039;塾生&#039;
		when 状態区分 = 2 then &#039;塾外生&#039;
		when 状態区分 = 3 then &#039;プール生&#039;
		when 状態区分 = 4 then &#039;退塾&#039;
		when 状態区分 = 5 then &#039;休塾&#039;
		when 状態区分 = 6 then &#039;既卒&#039;
		end as 状態区分名,
		 count(*) as 件数
from dbo.VM_生徒塾種情報
where 状態区分 &lt;&gt; 0
group by 状態区分 order by 状態区分;

--３－３
--今現在の日付時刻を調べる、ＳＱＬ文を作成してください。
--実行(Ctrl+E)した結果を、コメント欄に書いてください。（書き方自由）

SELECT getdate();
--2022-11-02 14:01:13.923


--３－４
--「VT_テスト生徒得点情報」テーブル使用
--	生徒コード「 1392 」の生徒の2012年2月に受けた、公開学力テストの
--受験科目の合計得点、平均点、最高点、最低点、を出力してください。
--※年月は実施日開始日で抽出。
-- 1392 は存在しなかったので、16225を使用（ほかの問題で使用した）
select sum(得点) as 合計得点,
		avg(得点) as 平均点,
		max(得点) as 最高点,
		min(得点) as 最低点
 from dbo.VT_テスト生徒得点情報 as a
 where 	生徒コード = 16225 and
 year(実施日開始日) = 2012 and 
 month(実施日開始日) = 2  and
a.得点 &lt;&gt; 999
 group by 生徒コード


-- ３－５
--	３－４の生徒の平均を少数第２位で四捨五入してください。
select sum(得点) as 合計得点,
		round(avg(得点),2) as 平均点,
		max(得点) as 最高点,
		min(得点) as 最低点
 from dbo.VT_テスト生徒得点情報 as a
 where 	生徒コード = 16225 and
 year(実施日開始日) = 2012 and 
 month(実施日開始日) = 2 and
得点&lt;&gt;999  
 group by 生徒コード



--３－６
--	３－４の応用編。下記の様に抽出して下さい。
--受験教室	学年コード	受験者数	合計	平均	最高点	最低点
--101	2	73	5460.0 	74.794520	95.0 	20.0 

 select 受験教室コード as 受験教室,学年コード,
		count(*) as 受験者数,
		sum(得点) as 合計,
		avg(得点) as 平均,
		max(得点) as 最高点,
		min(得点) as 最低点
 from dbo.VT_テスト生徒得点情報 as a
 where  得点 &lt;&gt; 999 and
		 year(実施日開始日) = 2012 and 
		month(実施日開始日) = 2  
 group by 受験教室コード,学年コード
 order by 受験教室コード,学年コード


-- ３－７
--[列名]	現在の日付時刻　     
--翌日の日付時刻　     
--昨日の日付時刻       
--現在の年　		
--現在の月		
--現在の日		を表示して下さい。

SELECT getdate() as 現在の日付時刻,
		getdate()+1 as 明日の日付時刻,
		getdate()-1 as 昨日の日付時刻,
		year(getdate()) as 現在の年,
		month(getdate()) as 現在の月,
		day(getdate()) as 現在の日

--３－８
--	[列名]	３日前の日付時刻	３日後の日付時刻
--		３ヶ月前の日付時刻	３ヶ月後の日付時刻
--		３年前の日付時刻	３年後の日付時刻
select  getdate()-3 as 昨日の日付時刻,
		dateadd(m,3,getdate()) &#039;３ヶ月後の日付時刻&#039;,
		dateadd(yy,3,getdate()) as &#039;３年後の日付時刻&#039;,
		year(dateadd(yy,-8,getdate())) as &#039;8年前の年&#039;;


--３－９
--	「生徒塾種情報」テーブル使用
--所属教室コード単位、状態区分単位で集約してください。
--※各教室コードはVM_組織マスタ(塾種区分=1かつ組織タイプ=3)を参照。
--※状態区分はVM_生徒種マスタ参照。
--[条件]　所属教室＝西宮、上本町、四条烏丸、西大寺、名古屋、和歌山　のみ。
-- [列名]  所属教室コード		：　教室コード
--‘西宮’‘上本町’	…	：　教室名
--状態区分	　		：　状態
--‘塾生’‘塾外生’	…	：　状態名称
--（関数を使用して）		：　生徒数


select a.所属教室コード as 教室コード , b.組織名略称１ as 教室名,a.状態区分 as 状態 ,c.名称 as 状態名称,count(a.生徒コード) as 生徒数
 from dbo.VM_生徒塾種情報 as a
join  VM_組織マスタ as b on a.所属教室コード = b.組織KEY
join  VM_生徒種マスタ as c on a.状態区分 = c.生徒種区分
where (b.組織名略称１ like &#039;%西宮%&#039; or
	 b.組織名略称１ like &#039;%上本町%&#039;or
	 b.組織名略称１ like &#039;%四条烏丸%&#039;or
	 b.組織名略称１ like &#039;%西大寺%&#039;or
	 b.組織名略称１ like &#039;%名古屋教室%&#039;or
	 b.組織名略称１ like &#039;%和歌山%&#039;) and 
	 b.塾種区分 = 1 and b.組織タイプ= 3 
group by a.所属教室コード , b.組織名略称１,a.状態区分,c.名称
order by 教室コード,　状態 desc;


--３－１０
--「VM_組織マスタ」使用
--	[条件]　塾種区分＝1　かつ　組織タイプ＝3
select cast(組織KEY as varchar) +&#039; ： &#039; +組織名略称１ as 教室一覧 from dbo.VM_組織マスタ
where 塾種区分 = 1　and　組織タイプ = 3
order by 組織KEY;

--３－１１
--「VM_生徒受講情報」テーブル使用
--[条件]　2014年度かつ、講座コード＝5401かつ、
--三田教室, 天王寺教室, 草津教室の生徒を検索してください。
--ただし、年度の取得は関数を使うこと。

select cast(year(開始日) as varchar)+&#039; 年度&#039; as 受講年度,b.組織名略称１ as 教室名, &#039;小５　選択社会&#039;as 講座名,クラスコード,生徒コード from dbo.VM_生徒受講情報 as a
join  VM_組織マスタ as b on a.教室コード = b.組織KEY
where (b.組織名略称１ like &#039;%三田%&#039; or
	 b.組織名略称１ like &#039;%天王寺%&#039; or
	 b.組織名略称１ like &#039;%草津%&#039; ) and 
	 b.塾種区分 = 1 and b.組織タイプ= 3 
	 and year(開始日) = 2014 
	 and 講座コード = 5401
order by a.教室コード, クラスコード desc , 生徒コード;

--－１２
--	「生徒基本情報」テーブル使用	飛び級生のみ一覧を表示
--	浜　花　子　＊　→　浜　花　子　★	　置換してください。（生徒帳票用氏名を置換）
--　　　※ＳＥＬＥＣＴ文で置換！！ＵＰＤＡＴＥでの更新はしないでください。

select 生徒コード,replace(生徒帳票用氏名,&#039;*&#039;,&#039;★&#039;) as 生徒帳票用氏名,a.生徒氏名カナ_半角 
from dbo.VM_生徒基本情報 as a
where a.生徒帳票用氏名 like &#039;%*%&#039;;

--３－１３
--	３－１２で「★マーク」に変換した、ＳＱＬ文をさらに
--	浜　花　子　★　→　浜花子★　と置換してください。
select 生徒コード,replace(replace(生徒帳票用氏名,&#039;*&#039;,&#039;★&#039;),&#039; &#039;,&#039;&#039;) as 生徒帳票用氏名,a.生徒氏名カナ_半角 
from dbo.VM_生徒基本情報 as a
where a.生徒帳票用氏名 like &#039;%*%&#039;;

--３－１４
--３－３で抽出した生徒の得点を、
--合計……少数第１位までを非表示、文字列に変換
--平均……少数第２位を四捨五入、少数第１位までを表示、文字列に変換
--最高点…文字列に変換
--最低点…文字列に変換

select cast(cast(sum(得点)as decimal) as varchar) as 文字列型_合計,
		cast(round(avg(得点),2)as decimal(3,1)) as 文字列型_平均,
		cast(max(得点) as varchar) as 文字列型_最高点,
		cast(min(得点) as varchar)as 文字列型_最低点
 from dbo.VT_テスト生徒得点情報 as a
 where 	生徒コード = 16225 and
 year(実施日開始日) = 2012 and 
 month(実施日開始日) = 2  and
得点 &lt;&gt; 999
 group by 生徒コード

-- ３－１５ @@@@@@@@@@@@@@@@@@@@@@
--	「生徒基本情報」使用
--	生徒帳票用氏名に「＊」が何文字目に含まれているか検索してください。
--	[条件]	飛び級生のみ
--	[列名]	生徒コード、生徒帳票用氏名、何文字目
--※SELECT句で、CHARINDEXを利用します。空白もカウントされます。

select a.生徒コード, a.生徒帳票用氏名,CHARINDEX(&#039;*&#039;,a.生徒帳票用氏名) as 何文字目
from dbo.VM_生徒基本情報 as a
where a.生徒帳票用氏名 like &#039;%＊%&#039;;


--３－１６
--	「講座マスタ」使用
--６年生が受講する講座の内で、講座名称「最高レベル」「女子トップレベル」「Ｍレベル」の
--講座のみを抽出し、それぞれ「最・女・Ｍ」の文字が何文字目から含まれているかを検索し下記の表を参考に作成してください。
--[条件]	削除区分	＝	0
--※SELECT句や、WHERE句で、CHARINDEXを利用します。

select 講座コード,charindex(&#039;最&#039;,講座名称)as 最高レベル,charindex(&#039;女&#039;,講座名称)as 女子トップ,
		charindex(&#039;Ｍ&#039;,講座名称)as Ｍレベル,講座名称
from dbo.VM_講座マスタ
where (講座名称 like &#039;%最高レベル%&#039; or
	講座名称 like &#039;%女子トップレベル%&#039; or
	講座名称 like &#039;%Ｍレベル%&#039;) and
	削除区分 = 0 ;


------------------------------------------------------------11/4
--３－１７
--	「講座マスタ」使用
--	６年生が受講する講座のうち、削除区分が0で
--　最高レベル特訓		      　  最レ
-- 女子トップレベル特訓		  	 トップレ
-- Ｍレベル特訓			 	     Ｍレ
-- 選択社会						社会
-- 日曜志望校別特訓（日曜特訓）	 日特
-- 灘中合格特訓				     灘中
--日曜錬成特訓				     日錬
--の７つの講座のみを抽出し、「大分類」の列名を追加し、上記の値を設定して下さい。
--大分類名	講座名称	講座コード
--Ｍレ	小６　Ｍレベル特訓　算数　	6308
--Ｍレ	小６　Ｍレベル特訓難問解消	6309

select 
	case 
		when 講座名称 like &#039;%最高レベル特訓%&#039; then &#039;最レ&#039;
		when 講座名称 like &#039;%女子トップレベル特訓%&#039; then &#039;トップレ&#039;
		when 講座名称 like &#039;%Ｍレベル特訓%&#039; then &#039;Ｍレ&#039;
		when 講座名称 like &#039;%選択社会%&#039; then &#039;社会&#039;
		when 講座名称 like &#039;%日曜志望校別特訓（日曜特訓）%&#039; then &#039;日特&#039;
		when 講座名称 like &#039;%灘中合格特訓%&#039; then &#039;灘中&#039;
		when 講座名称 like &#039;%日曜錬成特訓%&#039; then &#039;日練&#039;
	end as 大分類名,
	講座名称,
	講座コード
from dbo.VM_講座マスタ
where (講座名称 like &#039;%最高レベル特訓%&#039; or
	講座名称 like &#039;%女子トップレベル特訓%&#039; or
	講座名称 like &#039;%Ｍレベル特訓%&#039; or 
	講座名称 like &#039;%選択社会%&#039; or 
	講座名称 like &#039;%日曜志望校別特訓（日曜特訓）%&#039; or 
	講座名称 like &#039;%灘中合格特訓%&#039; or 
	講座名称 like &#039;%日曜錬成特訓%&#039; ) and
	削除区分 = 0 
group by 講座名称,講座コード 
order by 大分類名


--３－１８
--	「教室別講座マスタ」使用
--西宮教室で、2012年以降に始まる全ての講座を検索し下記の様に表示して下さい。
--　　　ただし、来年もこのソース（SQL文）を利用できるよう、日付の書き方で「年度=2012」
--などと、固定で数値や文字を記述せず、関数を使用します。
-- データは2014年までしかないので、2022年に「来月開講」とすると結果はゼロ件となる。
--９年前の翌月にした

select year(開始日)as 年度, 教室コード, 講座コード,
	SUBSTRING(cast(開始日 as varchar),7,4)+&#039;/&#039;+left(開始日,2)+ &#039;/01～&#039; as &#039;９年前の翌月開始日&#039; 
from dbo.VM_教室別講座マスタ as a
join dbo.VM_組織マスタ as b
	on a.教室コード = b.組織KEY
where 開始日 &gt;= cast(year(dateadd(yy,-9,getdate())) as varchar )+&#039;-&#039;+cast(month (dateadd(mm,1,getdate())) as varchar)+&#039;-01&#039;
	and b.組織名略称２ like &#039;西宮&#039; and b.塾種区分 = 1
order by 開始日;

--３－１９
--	「VT_テスト生徒成績集計情報」使用
--	第４７０回公開学力テスト、６年生の３科目合計の平均偏差値をランキングしてください。
--	　※Ｅ-Ｒ図【成績情報】より、赤字の列名はWHERE句に記述します。
--	　　ただし、今回は生徒コードを指定しないので、記述しなくてもよい。

select rank() over (order by avg(偏差値) desc ) as 順位 , 年度, 回数, 受験教室コード,
	cast(round(avg(偏差値),2) as decimal(3,1))as 平均偏差値, 生徒コード
from dbo.VT_テスト生徒成績集計情報
where 回数 = 470 and
		学年コード = 6
group by 年度,回数,受験教室コード,生徒コード;


--３－２０
--	「テスト生徒成績集計情報」使用
--	２０１２年４月、公開学力テストを上本町で受験した生徒を学年単位、大クラス単位で、
--	下記の様に、ランキングして下さい。平均偏差値は２科目。

select rank() over (order by 学年コード, 大クラスコード, avg(偏差値) desc ) as 順位 ,
		年度,回数,学年コード,大クラスコード,
		cast(round(avg(偏差値),2) as decimal(3,1))as 平均偏差値,生徒コード
from dbo.VT_テスト生徒成績集計情報 as a
join dbo.VM_組織マスタ as b
		on a.教室コード = b.組織KEY
where	回数　= 469 and
		b.組織名略称２ like &#039;上本&#039; and b.塾種区分 = 1 and
		年度 = 2012 and month(実施日開始日) = 4
group by	年度,回数,学年コード,大クラスコード,生徒コード
order by	学年コード,大クラスコード,平均偏差値 desc;


--３－２１
--	「生徒受講情報」使用
--本年度、４年生受講講座「一般コース」を受講の生徒を、大クラス単位で、
--下記の様に、ナンバリング（採番）して下さい。

select ROW_NUMBER() OVER(partition by 大クラスコード ORDER BY 大クラスコード,生徒コード),大クラスコード,生徒コード, year(a.開始日) as 年 from dbo.VM_生徒受講情報 as a
where	year(a.開始日)  = 2012 and
		講座コード = 4101 and 
		受講学年コード = 4
group by	大クラスコード,生徒コード,開始日





select * from dbo.VM_生徒受講情報 as a
where	year(a.開始日)  = 2012 and
		講座コード = 4101 and 
		受講学年コード = 4;    </description>
    <dc:date>2022-11-04T13:28:08+09:00</dc:date>
    <utime>1667536088</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/note4recurrent/pages/35.html">
    <title>SQL-</title>
    <link>https://w.atwiki.jp/note4recurrent/pages/35.html</link>
    <description>
      ---１－１
---VM_生徒基本情報の全ての列を取得して下さい。

select * from dbo.VM_生徒基本情報;
---１－２
---VM_生徒塾種情報の全ての列を取得して下さい。

select * from dbo.VM_生徒塾種情報;

---１－３
---VM_生徒受講情報の全ての列を取得して下さい。
select * from dbo.VM_生徒受講情報;

---１－４
---VM_組織マスタの全ての列を取得してください。
select * from dbo.VM_組織マスタ;
---１－５
---VM_クラスマスタの全ての列を取得してください。
select * from dbo.VM_クラスマスタ;

---１－６
---生徒コード列が「301～320」の条件を満たす、
---VM_生徒基本情報の全ての列を取得して下さい。

select * from dbo.VM_生徒基本情報 where 生徒コード between 301 and 320;

---１－７
---退塾の生徒（状態区分列が3）の条件を満たす、
---VM_生徒塾種情報の全ての列を取得して下さい。

select * from dbo.VM_生徒塾種情報 where 状態区分  = 3;

---１－８
---受講年度列が2011かつ、
---講座コード列が5100かつ、
---教室コード列が201の条件を満たす、
---VM_生徒受講情報の全ての列を取得して下さい。

select * from dbo.VM_生徒受講情報 where 
	受講年度= 2011 and 
	講座コード = 5100 and
	教室コード = 201 ;

---１－９
---現在受講中 である条件を満たす、
---VM_生徒受講情報の全ての列を取得して下さい。
---「現在受講中」とは、開始日列がNULL以外、終了日列がNULLの状態を指します。

select * from dbo.VM_生徒受講情報 where
	開始日 is not NULL and 終了日 is NULL;

---１－１０
---塾種区分列が1かつ、組織タイプ列が3かつ、
---組織KEY列が「850」「701」以外 の条件を満たす、
---VM_組織マスタの全ての列を取得して下さい。
---但し、組織KEY列の条件は「IN」または「NOT IN」を使用して下さい。

select * from dbo.VM_組織マスタ where 
	組織KEY not in (850,701) and 
	塾種区分 = 1 and
	組織タイプ = 3;

---１－１１
---塾種区分列が1かつ、組織タイプ列が3かつ、
---組織KEY列が「850」「701」以外 の条件を満たす、
---VM_組織マスタの組織KEY列、組織名略称1列、組織名略称2列、組織名略称3列を取得して下さい。

select 組織KEY,組織名略称1,組織名略称2,組織名略称3 from dbo.VM_組織マスタ where
	組織KEY not in (850,701) and 
	塾種区分 = 1 and
	組織タイプ = 3;

---１－１２
---塾種区分列が1かつ、組織タイプ列が3かつ、
---組織KEY列が「850」「701」以外 の条件を満たす、
---VM_組織マスタの組織KEY列、組織名略称1列、組織名略称2列、組織名略称3列を取得して下さい。
---但し、組織KEY列は「教室コード」、組織名略称1列は「教室名」に変更して取得して下さい。

 select 組織KEY as 教室コード,
	組織名略称1 as 教室名,
	組織名略称2  ,
	組織名略称3   
	from dbo.VM_組織マスタ where
	組織KEY not in (850,701) and 
	塾種区分 = 1 and
	組織タイプ = 3;

---１－１３
---教室コード列が101かつ、学年コード列が6の条件を満たす、
---VM_クラスマスタのクラスコード列、クラス名称帳票用列、大クラスコード列を取得して下さい。
---但し、クラスコード列は「クラス」、クラス名称帳票用列は「クラス名称」に変更して取得して下さい。

select クラスコード as クラス,
		クラス名称帳票用 as クラス名称,
		大クラスコード
from dbo.VM_クラスマスタ
where	教室コード = 101 and
		 学年コード = 6;

--- １－１４
---飛び級生である、VM_生徒基本情報の全ての列を取得して下さい。
---ここで、「飛び級生」は生徒帳票用氏名列に「*」が付いている状態を指します。

select *
from dbo.VM_生徒基本情報
where 生徒帳票用氏名 = &#039;*&#039;;

--- １－１５
--- 性別列が「女子」（2）「男子」（1）の順、さらに生徒氏名カナ_半角列の昇順で
--- VM_生徒基本情報の全ての列を取得して下さい。

select *
from dbo.VM_生徒基本情報
order by 性別 desc ,生徒氏名カナ_半角;

---１－１６
---VM_生徒基本情報の件数を取得して下さい。

select count(*) from dbo.VM_生徒基本情報;

---１－１７
---１性別が「女子」（2）の条件を満たす、VM_生徒基本情報の件数を取得して下さい。

select count(*) from dbo.VM_生徒基本情報
where 性別 = 2;

---１－１８
---VM_生徒基本情報の郵便番号1列を取得して下さい。
select 郵便番号1 from dbo.VM_生徒基本情報;


---１－１９
---VM_生徒基本情報の郵便番号1列をDISTINCT句を付けて取得して下さい。
select distinct 郵便番号1 from dbo.VM_生徒基本情報;

---１－２０
---VM_生徒基本情報の郵便番号1列をGROUP BY句を付けて取得して下さい。
select 郵便番号1 from dbo.VM_生徒基本情報
group by 郵便番号1;

---１－２１
---VM_生徒基本情報の郵便番号1列、郵便番号2列を取得して下さい。
select 郵便番号1,郵便番号2 from dbo.VM_生徒基本情報;

---１－２２
---VM_生徒基本情報の郵便番号1列、郵便番号2列をDISTINCT句を付けて取得して下さい。
select distinct 郵便番号1,  郵便番号2 from dbo.VM_生徒基本情報;

---１－２３
---VM_生徒基本情報の郵便番号1列、郵便番号2列をGROUP BY句を付けて取得して下さい。
select 郵便番号1,郵便番号2 from dbo.VM_生徒基本情報
group by 郵便番号1 , 郵便番号2;

---１－２４
---VM_生徒基本情報の郵便番号1列の値ごとの件数を取得して下さい。
select count(郵便番号1) from  dbo.VM_生徒基本情報
group by  郵便番号1;

---１－２４
---VM_生徒基本情報の郵便番号1列の最大値を取得して下さい。
select max(郵便番号1) from  dbo.VM_生徒基本情報

---１－２５
---VM_生徒基本情報の郵便番号1列の最小値を取得して下さい。
select min(郵便番号1) from  dbo.VM_生徒基本情報

---２－１
---VM_学校マスタの全ての列を取得して下さい。
select * from  dbo.VM_学校マスタ;

---２－２
---年度列が2014の条件を満たす、VM_学校マスタの全ての列を取得して下さい。

select * from  dbo.VM_学校マスタ
where 年度 = 2014;

---２－３
--年度列が2014かつ、男女区分列が1（男子校）の条件を満たす、VM_学校マスタの全ての列を取得して下さい。

select * from  dbo.VM_学校マスタ
where 年度 = 2014 and 
男女区分 = 1;

---２－４
--年度列が2014かつ、男女区分列が2（女子校）の条件を満たす、VM_学校マスタの全ての列を取得して下さい。

select * from  dbo.VM_学校マスタ
where 年度 = 2014 and 
男女区分 = 2;

---２－５
--年度列が2014かつ、男女区分列が3（共学校）の条件を満たす、VM_学校マスタの全ての列を取得して下さい。

select * from  dbo.VM_学校マスタ
where 年度 = 2014 and 
男女区分 = 3;

---２－６
--年度列が2014かつ、男女区分列が2（女子校）かつ、
--都道府県コード列が27（大阪府）の条件を満たす、VM_学校マスタの全ての列を取得して下さい。

select * from  dbo.VM_学校マスタ
where 年度 = 2014 and 
男女区分 = 2 and 
都道府県コード = 27;

---２－７
--年度列が2014かつ、男女区分列が2（女子校）かつ、
--都道府県コード列が27（大阪府）かつ、
--住所1列に「大阪市」を含む条件を満たす、VM_学校マスタの全ての列を取得して下さい。

select * from  dbo.VM_学校マスタ
where 年度 = 2014 and 
男女区分 = 2 and 
都道府県コード = 27 and
住所1 like &#039;%大阪市%&#039;;

---２－８
--年度列が2014かつ、男女区分列が2（女子校）かつ、都道府県コード列が27（大阪府）かつ、
--住所1列に「大阪市」を含むかつ、住所1列に「東大阪市」を含まない条件を満たす、
--VM_学校マスタの全ての列を取得して下さい。

select * from  dbo.VM_学校マスタ
where 年度 = 2014 and 
男女区分 = 2 and 
都道府県コード = 27 and
住所1 like &#039;%大阪市%&#039; and
住所1 not like &#039;%東大阪市%&#039;;

---２－９
--VM_個人別月謝情報の全ての列を取得して下さい。
select * from dbo.VM_個人別月謝情報;

---２－１０
--生徒コード列が16の条件を満たす、VM_個人別月謝情報の全ての列を取得して下さい。

select * from dbo.VM_個人別月謝情報
where 生徒コード = 16225;

---２－１１
--生徒コード列が16の条件を満たす、VM_個人別月謝情報の合計金額（金額列の合計）を取得して下さい。

select sum(金額) from dbo.VM_個人別月謝情報
where 生徒コード = 16225;

---２－１２
--生徒コード列が16の条件を満たす、VM_個人別月謝情報の年度ごとの（年度別の値ごとの）
--合計金額（金額列の合計）を取得して下さい。

select 年度,sum(金額) from dbo.VM_個人別月謝情報
where 生徒コード = 16225
group by 年度;

---２－１３
--２－１１と２－１２の抽出結果をUNION句を使用して一覧表示して下さい。
--但し、２－１１の年度列は「合計」と表示して下さい。

２－１１と２－１２の抽出結果をUNION句を使用して一覧表示して下さい。
但し、２－１１の年度列は「合計」と表示して下さい。
select str(年度),sum(金額) from dbo.VM_個人別月謝情報
where 生徒コード = 16225
group by 年度
union
select &#039;合計&#039; as 年度 ,sum(金額)as 合計 from dbo.VM_個人別月謝情報
where 生徒コード = 16225;


---２－１４
--VM_生徒塾種情報の状態区分ごとの件数を取得して下さい。
--但し、状態区分ごとの状態名をCASE句を使用して以下の例のように表示して下さい。

select  状態区分,
		case 
		when 状態区分 = 1 then &#039;塾生&#039;
		when 状態区分 = 2 then &#039;塾外生&#039;
		when 状態区分 = 3 then &#039;プール生&#039;
		when 状態区分 = 4 then &#039;退塾&#039;
		when 状態区分 = 5 then &#039;休塾&#039;
		when 状態区分 = 6 then &#039;既卒&#039;
		end as 状態区分名, count(*) as 件数
from dbo.VM_生徒塾種情報
where 状態区分 &lt;&gt; 0
group by 状態区分 order by 状態区分;

---２－１５
--生徒コード列が16225かつ、年度列が2013かつ、
--回数列が483を満たすVT_テスト生徒得点情報の全ての列を取得して下さい。

select * from dbo.VT_テスト生徒得点情報
where 生徒コード = 16225 and
回数 = 483;

---２－１６
--生徒コード列が16225かつ、年度列が2013かつ、回数列が483を満たす
--VT_テスト生徒得点情報の得点列の合計と得点列の平均を取得して下さい。

select sum(得点)as 合計,avg(得点) as 平均 from dbo.VT_テスト生徒得点情報
where 生徒コード = 16225 and
年度 = 2013 and 
回数 = 483;

---２－１７
--年度列が2013かつ、回数列が483を満たすVT_テスト生徒得点情報の教室コード列、
--学年コード列ごとの得点列の件数、得点列の合計、得点列の平均、得点列の最大値、
--得点列の最小値を取得して下さい。

select 
教室コード,
学年コード,
count(得点)as 件数,
sum(得点) as 合計,
avg(得点)as 平均,
max(得点)as 最高,
min(得点)as 最低

 from dbo.VT_テスト生徒得点情報
group by 教室コード,学年コード
order by 学年コード, 教室コード;

---２－１８
--VM_生徒基本情報の生徒帳票用氏名列と、VM_学校マスタの学校名を取得して下さい。
--但し、VM_学校マスタの年度列は2014、VM_生徒基本情報の在籍校コードと
--VM_学校マスタの学校コードをつないで下さい。

select child.生徒帳票用氏名,school.学校名
from dbo.VM_生徒基本情報 as child
join dbo.VM_学校マスタ as school
on child.在籍校コード = school.学校コード
where school.年度 = 2014;

---２－１９
--VM_組織マスタの組織KEY列、組織名列、上位組織KEY列、
--上位組織KEYの組織名（上位組織名）を取得して下さい。
--但し、上位組織KEYが0の組織は抽出対象から除外して下さい。

select a.組織KEY, a.組織名,a.上位組織KEY,b.組織名
from dbo.VM_組織マスタ as a
join dbo.VM_組織マスタ as b
on a.上位組織KEY = b.組織KEY
where a.上位組織KEY &lt;&gt;0
order by a.組織KEY;

---２－２０
--VM_講座マスタには講座コード列と翌年度講座コード列があります。
--講座コード列が1100（小１　一般コース）のデータから、
--翌年度講座コード列に該当する講座コード列のデータを
--再帰のSQLを使用して取得し、小１から小６のデータを表示して下さい。（ヒント：「SQL 再帰」で検索）

with r as (select * from dbo.VM_講座マスタ where 講座コード = 1100
union all
select dbo.VM_講座マスタ.* from dbo.VM_講座マスタ, r where r.翌年度講座コード = dbo.VM_講座マスタ.講座コード)
select * from r;

---https://www.letitride.jp/entry/2020/06/15/161826

---３－１
--VM_ユーザーマスタのユーザーIDには「ka-takemori」や「t-murotani」のように
--「名前の先頭1文字または2文字-苗字」の形でデータが登録されています
--（中には「syssekiguchi」のように途中にハイフンが入っていないデータもありますが無視して下さい）。
--VM_ユーザーマスタのユーザーIDのハイフンとハイフンより前の文字を除去、すなわち、苗字のみの文字列に置き換えて、同じ苗字の件数の多い順、ユーザーIDの昇順に並び替えて表示して下さい。

select count(sub.uid)as 件数,uid from
(select SUBSTRING(ユーザーID,charindex(&#039;-&#039;,ユーザーid)+1,50) as uid
from dbo.VM_ユーザーマスタ) as sub
group by sub.uid
order by 件数 desc, sub.uid;

--３－２
--　VM_学校マスタには学校の情報が年度別に登録されています。
--このうち、年度が2014で、都道府県別で学校コードが一番小さい学校のVM_学校マスタの全ての列を
--都道府県コードの小さい順に表示して下さい。
--但し、都道府県コードは1から47までの範囲に絞って下さい。
select *
from dbo.VM_学校マスタ
where 学校コード in (select min(学校コード) from  dbo.VM_学校マスタ where 都道府県コード between 1 and 47
 group by 都道府県コード) 
 and dbo.VM_学校マスタ.年度　= 2014
order by 都道府県コード
--------------------------------------  11/1

---３－３
--VM_銀行マスタの情報が、VM_銀行支店マスタには支店の情報が登録されています。
--　銀行コードごとの支店数をVM_銀行支店マスタから取得し、
--支店数が50以上の銀行コード、銀行名称全角、支店数を支店数の多い順に表示して下さい。
--但し、VM_銀行マスタとVM_銀行支店マスタの結合はINNER JOINを使用して下さい。

select c.銀行コード,c.銀行名称全角,count(c.銀行名称全角) as 支店数
from (select a.銀行コード, a.銀行名称全角
	from dbo.VM_銀行マスタ as a
	inner join  dbo.VM_銀行支店マスタ as b
	on a.銀行コード = b.銀行コード) as c
where c.銀行名称全角 &lt;&gt; &#039;&#039;
group by c.銀行コード,c.銀行名称全角
having count(c.銀行名称全角) &gt;= 50
order by 支店数 desc;


---３－４
--　VM_個人別月謝情報には生徒ごとの月謝の情報が登録されています。
--　生徒ごとに年度単位の金額の合計を集計し、年度ごとに最も多くの
--金額を支払っている生徒の生徒コードと金額の合計を年度の昇順で表示して下さい。


with z as(
select * 
from (select 年度,生徒コード,sum(金額)as 金額 
	from dbo.VM_個人別月謝情報
	group by 生徒コード, 年度) b
where 金額 in 
(select max(a.金額)as 金額 from 
(select 年度,生徒コード,sum(金額)as 金額 
	from dbo.VM_個人別月謝情報
	group by 生徒コード, 年度) as a
group by a.年度))
select y.* from (select 年度,max(金額) as 金額 from z group by 年度) as x
inner join z as y on y.年度 = x.年度 and y.金額 = x.金額
order by y.年度


---３－５
--　VM_住所マスタには住所の情報が登録されています。
--　大阪市や神戸市のように、区を持つ市は市区町村名が「〇〇市〇〇区」で登録されていますが、
--VM_住所マスタを使用して、区を持つ市を区数の多い順に表示して下さい。

select left(b.市区町村名,charindex(&#039;市&#039;,b.市区町村名)) as 市名,count(b.市区町村名)as 区数
from 	(select	a.市区町村名
	from	dbo.VM_住所マスタ as a
	where  charindex(&#039;区&#039;,a.市区町村名) &gt; 0 and charindex(&#039;市&#039;,a.市区町村名) &gt;0
	group by a.市区町村名) as b
group by left(b.市区町村名,charindex(&#039;市&#039;,b.市区町村名))
order by 区数 desc


---３－６
--　VM_生徒志望校情報には生徒ごとの志望校の情報が登録されています。
--　VM_生徒志望校情報の志望校ごとの合計（志望数）を集計し、
--志望校とVM_学校マスタとの学校コードと紐付けて志望数の多い上位10校の学校コード、
--学校名、志望数を表示して下さい。また、学校名については年度が2014のものを表示して下さい。

select top(10) c.志望校 as 学校コード, c.学校名 , count(c.学校名) as 件数
from(select a.志望校 , b.学校名
	from dbo.VM_生徒志望校情報 as a
	inner join dbo.VM_学校マスタ as b
	on a.志望校 = b.学校コード
	where b.年度 =2014) as c
group by c.志望校, c.学校名
order by 件数 desc    </description>
    <dc:date>2022-11-04T13:27:43+09:00</dc:date>
    <utime>1667536063</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/note4recurrent/pages/34.html">
    <title>SQL_training</title>
    <link>https://w.atwiki.jp/note4recurrent/pages/34.html</link>
    <description>
      -複数テーブルの結合と絞りこみ
 select Hell.id, Hell.name, Element.name as element, Grade.name as grade
 from Hell
 join Element
 on Hell.element_id = Element.id
 join Grade
 on Hell.grade_id = Grade.id
 where Element.name =&quot;Air&quot; and  Grade.name =&quot;Boss&quot;

-副問合せと複数joinの組み合わせ
-- Hellテーブルから、モンスターの「Graffiacane」(Hellテーブルのnameが「 Graffiacane 」のレコード) 
-- の弱点となる属性名を持ち、階級が「Boss」であるレコードをすべて出力してください。
-- 弱点はElementCompatibilityテーブルに格納されており、
-- 弱点に対応する属性名はelement_id、weakness_element_idを外部キーとしてElementテーブルを
-- 外部参照することで取得できます。
 select H.id , H.name, E.name as element, G.name as grade
 from Hell as H
 join Element as E　
 on H.element_id = E.id
 join Grade as G　
 on H.grade_id = G.id
 join ElementCompatibility as EC
 on E.id = EC.weakness_element_id
 where G.name = &quot;Boss&quot; and H.element_id = (
 select EC.weakness_element_id from Hell as H
 join Element as E
 on E.id = H.element_id
 join ElementCompatibility as EC
 on E.id = EC.element_id
 where H.name =&quot;Graffiacane&quot;
 )


-SCOTT と同じdeptno,job の社員の ename,deptno.jobを表示
 SELECT ename, deptno, job
 FROM   emp
 WHERE  (deptno,job)  = (SELECT deptno,job 
                         FROM   emp
                         WHERE  ename=&#039;SCOTT&#039;);

-最低sal のename,sal
 SELECT ename, sal
 FROM   emp
 WHERE  sal = (SELECT MIN(sal) 
               FROM   emp);
 
-deptno 別の平均sal が最低の部署のdeptno,平均salを表示
 SELECT deptno, TRUNC(AVG(sal)) as AVG_SAL
 FROM   emp
 GROUP BY deptno
 HAVING AVG(sal) = (SELECT MIN(AVG(sal))
                    FROM   emp
                    GROUP BY deptno);


-「自分の所属する部門の平均給与よりも、給与が高い社員は誰か」
 SELECT ename, deptno, sal
 FROM   emp o
 WHERE  sal &gt; (SELECT AVG(sal)
               FROM   emp i
               GROUP BY deptno
               HAVING i.deptno = o.deptno );

-上と同じ条件
 SELECT  e.ename, e.deptno, e.sal
 FROM    emp e 
 JOIN    (SELECT deptno, AVG(sal) avg_sal
 　         FROM   emp
 　         GROUP BY deptno) i
 ON      e.deptno = i.deptno
 WHERE   e.sal &gt; i.avg_sal;    </description>
    <dc:date>2022-10-31T22:01:11+09:00</dc:date>
    <utime>1667221271</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/note4recurrent/pages/33.html">
    <title>temp</title>
    <link>https://w.atwiki.jp/note4recurrent/pages/33.html</link>
    <description>
      # coding: utf-8
# 自分の得意な言語で
# Let&#039;s チャレンジ！！

d,n,bar = map(int,input().split())

cn = 0 #current number
m = 0 #移動量
offset = d//2

# print(l[d//2])
for i in range(n):
    tn = int(input())
    if cn == 0:
        if tn &lt; offset:
            m += tn-cn
        else:
            m+= offset - tn
    elif cn == offset:
        if tn &gt; offset:
            m+= tn -offset
        else:
            m+= offset - tn 
    elif cn &lt; offset:
        if tn &gt; cn+offset and tn &gt; cn:
            m += tn -cn
        else:
            if tn &gt; offset:
                tn -= d
            m+= tn+*cn
    elif cn &gt; offset:
        if tn &gt; cn+offset and tn &gt; cn:
            m += tn -cn
        else:
            if tn &gt; offset:
                tn -= d
            m+= tn+*cn







if m &gt; bar:
    print(&quot;No&quot;)
else:
    print(&quot;Yes&quot;)    </description>
    <dc:date>2022-09-30T13:50:37+09:00</dc:date>
    <utime>1664513437</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/note4recurrent/pages/32.html">
    <title>アプリケーション企画実習</title>
    <link>https://w.atwiki.jp/note4recurrent/pages/32.html</link>
    <description>
      **2022/9/20
-何をするか
--クラス決め
--何をするか・チーム名・担当決め
**2022/9/21
-要件定義
-基本設計
--画面
--フロー
--DB
-詳細設計    </description>
    <dc:date>2022-09-21T14:02:40+09:00</dc:date>
    <utime>1663736560</utime>
  </item>
  </rdf:RDF>
