2017-12-14 3 views
2

を挿入します。表上の特定の値をループして、私は次の表を持って新しい行に

ID, UserID, CompanyID, AccountID, Year1, Month1 

私はすべてのAccountID秒をループへの道があり、各AccountIDに10行を挿入すると、挿入する必要がありますそれらのそれぞれについて、以下の値がありますか?

INSERT INTO Perms (UserID, CompanyID, AccountID, Year1, Month1) 
VALUES 
    (175, 74,x,2017,3), 
    (175, 74,x,2017,4), 
    (175, 74,x,2017,5), 
    (175, 74,x,2017,6), 
    (175, 74,x,2017,7), 
    (175, 74,x,2017,8), 
    (175, 74,x,2017,9), 
    (175, 74,x,2017,10), 
    (175, 74,x,2017,11), 
    (175, 74,x,2017,12) 

私は約100 AccountIDを持っています。私はある種のループが必要です。

これは実行可能ですか?

+0

accoutidを任意のテーブルに保存してからPermsテーブルに挿入していますか?各行で変更される値は何ですか? –

+0

アカウントIDの値は連続していますか? –

+0

あなたはCROSS JOINをお探しですか? –

答えて

2

アカウントと日付のシーケンスを表すためにCTEを使用します。アカウントID値の場合、再帰CTEを使用できます。以下では、1から100までの値を任意に生成しますが、このアプローチは任意の連続した範囲で機能するはずです。年/月の組み合わせについては、わずか10しかないため、CTEで単純にハードコードすることができます。次に、INSERT INTO ... SELECTを使用して、2つのCTEのクロス結合を使用します。

WITH accounts AS ( 
    SELECT 1 AS account 
    UNION ALL 
    SELECT account + 1 
    FROM accounts 
    WHERE account + 1 <= 100 
), 
cte AS (
    SELECT 2017 AS year, 3 AS month UNION ALL 
    SELECT 2017, 4 UNION ALL 
    SELECT 2017, 5 UNION ALL 
    SELECT 2017, 6 UNION ALL 
    SELECT 2017, 7 UNION ALL 
    SELECT 2017, 8 UNION ALL 
    SELECT 2017, 9 UNION ALL 
    SELECT 2017, 10 UNION ALL 
    SELECT 2017, 11 UNION ALL 
    SELECT 2017, 12 
) 
INSERT INTO Perms (UserID, CompanyID, AccountID, Year1, Month1) 
SELECT 175, 74, account, year, month 
FROM accounts 
CROSS JOIN cte; 
OPTION (MAXRECURSION 255); 

編集:

アカウントIDが連続していない場合は、この答えを続けるあなただけ手動で、例えば、CTEでそれらを一覧表示します

WITH accounts AS ( 
    SELECT 71 AS account UNION ALL 
    SELECT 74 UNION ALL 
    SELECT 78 UNION ALL 
    SELECT 112 UNION ALL 
    SELECT 119 
    -- and others 
) 
+0

答えが「月」ではないので、 ? – user3378165

+0

?私はCTE AFAIKで「月」を宣言しました。 –

+0

'Account'セクションではまだ宣言されていません。 – user3378165

0

あなたはアカウントIDのテーブルに格納されているし、何がしたいことは3から12にMONTH1と各アカウントIDに対して10行を挿入することで、この

WITH CTE 
AS 
(
    SELECT 
     Month2 = 1 

    UNION ALL 

    SELECT 
     Month2+1 
     FROM CTE 
      WHERE Month2 <12 
) 
INSERT INTO Perms (UserID, CompanyID, AccountID, Year1, Month1) 
SELECT 
    UserID = 175, 
    CompanyID ='X', 
    AccountID = YAT.AccountID, 
    Year1 = 2017, 
    Month1 = CTE.Month2 
    FROM CTE 
     INNER JOIN YourAccountTable YAT 
      ON CTE.Month2 BETWEEN 3 AND 12 

の変更をしようとした場合との句の場合

1

これを試してみてください。これは既存の回答と同じですが、よりコンパクトです:

;with cte as (
    select 175 [UserID], 74 [CompanyID], 2017 [Year1], 3 [Month1] 
    union all 
    select 175 [UserID], 74 [CompanyID], 2017 [Year1], [Month1] + 1 from cte 
    where [Month1] < 12 
) 
select A.[UserID], A.[CompanyID], B.[AccountID], A.[Year1], A.[Month1] from cte A cross join TABLE_NAME B 
+0

あなたの答えをありがとう、何らかの理由で各行が10回選択されています。 – user3378165

+0

それはあなたが望むものではありませんか? –

+0

各_Account_に10行の新しい行を追加する(3〜12ヶ月)が必要でしたが、このコードは実際に各アカウント100行に毎月10回追加されます。 – user3378165

関連する問題