投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/2/17 17:57:36
> 直近から2回分のみ取得したいです。

『直近』の定義は何ですか?
登録されている日付を、ID ごとの降順で上位 2 件拾えばよいのか、
それとも、特定の日付より前(または後)という条件が付くのか…。



> 結果をBテーブルにInsertしたいと思います。

たとえばこんな感じ。細かいところは適宜調整して下さい。
CTE 式(WITH ブロック)の代わりに、副問い合わせを使っても良いかな。

【B テーブルを新規作成】

WITH
  [ID_LIST] AS (SELECT DISTINCT [ID] FROM [Aテーブル]),
  [DT_LIST] AS (
    SELECT
      [ID]
    , [実施日]
    , [行番号] = ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [実施日])
    FROM  [Aテーブル]
    WHERE [業務内容] = N'訪問'
  )
SELECT
  [ID_LIST].[ID]
, MAX(CASE [行番号] WHEN 1 THEN [実施日] END) AS [実施日1]
, MAX(CASE [行番号] WHEN 2 THEN [実施日] END) AS [実施日2]
INTO
  [Bテーブル]
FROM
  [ID_LIST] LEFT JOIN [DT_LIST]
  ON [ID_LIST].[ID] = [DT_LIST].[ID]
  AND [DT_LIST].[行番号] <= 2
GROUP BY
  [ID_LIST].[ID]




【既存の B テーブルに追加】

WITH
  [ID_LIST] AS (SELECT DISTINCT [ID] FROM [Aテーブル]),
  [DT_LIST] AS (
    SELECT
    [ID]
  , [実施日]
  , [行番号] = ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [実施日])
   FROM [Aテーブル]
   WHERE [業務内容] = N'訪問'
  )
INSERT INTO [Bテーブル] ([ID], [実施日1], [実施日2])
SELECT
  [ID_LIST].[ID]
, MAX(CASE [行番号] WHEN 1 THEN [実施日] END)
, MAX(CASE [行番号] WHEN 2 THEN [実施日] END)
FROM
  [ID_LIST] LEFT JOIN [DT_LIST]
  ON [ID_LIST].[ID] = [DT_LIST].[ID]
  AND [DT_LIST].[行番号] <= 2
GROUP BY
  [ID_LIST].[ID]