Как вставить значения varchar в таблицу с помощью цикла

#sql-server-2008

#sql-server-2008

Вопрос:

Я получил таблицу с именем ATMONTH, где мне нужно проверять количество клиентов за каждый месяц

Структура таблицы похожа

 CREATE TABLE [dbo].[ATMONTH](
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[Month] [varchar](50) NULL,
[COUNT OF CUSTOMER] [varchar] (50) NULL,
[RefMonthStart] [varchar](50) NULL, 
[RefMonthEnd] [varchar](50) NULL) 
  

я принимаю вывод, подобный

1 1 месяц 3000 0 30

2 2Month 4500 31 60

3 3month 4000 61 90

4 4Month 6000 91 120

.

.

.

24 24 месяца .. .. ..

25> 24 месяца .. .. ..

где количество клиентов, на которые я ссылаюсь, относится к другой таблице.. здесь только месяц, refmonthstart и

столбец refmonthend должен быть вставлен вручную, где столбцы refmonthstart и refmonthend

количество дней в месяце

как я это сделаю …??

Заранее спасибо

Комментарии:

1. Не могли бы вы поделиться запросом, который вы используете для вставки этих данных сейчас?

2. Я твердо верю, что плакат должен активно отвечать на ответы, комментируя или принимая ответ. И если пользователь не заинтересован в получении ответа, то он не должен публиковать здесь вопросы и тратить время других людей, которые тратят свое время только на то, чтобы помочь пользователю.

3. Мне очень жаль, что я не ответил на ваш ответ, поскольку я был занят какой-то другой работой и был занят этим. И большое вам спасибо за ваш ответ, ваш ответ был очень полезен для меня. Еще раз спасибо, Нитин Гангадхаран

Ответ №1:

Попробуйте выполнить следующий запрос

DML:

 CREATE TABLE [dbo].[ATMONTH](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [Month] [varchar](50) NULL,
    [COUNT OF CUSTOMER] [varchar] (50) NULL,
    [RefMonthStart] [varchar](50) NULL, 
    [RefMonthEnd] [varchar](50) NULL)

INSERT INTO [dbo].[ATMONTH]([Month])
VALUES ('Jan'),
('Feb'),
('Mar'),
('Apr'),
('May'),
('Jun'),
('Jul'),
('Aug'),
('Sep'),
('Oct'),
('Nov'),
('Dec');


CREATE TABLE dbo.MonthsAndDays
(
    [Month] VARCHAR(3),
    Days SMALLINT
)

INSERT INTO dbo.MonthsAndDays([Month],Days)
VALUES ('Jan',31),
('Feb',28),
('Mar',31),
('Apr',30),
('May',31),
('Jun',30),
('Jul',31),
('Aug',31),
('Sep',31),
('Oct',30),
('Nov',30),
('Dec',31);
  

Запрос:

 DECLARE @refmonthstart INT = 0

;WITH CTE AS
(
    SELECT a.ID,
           a.Month,
           a.[COUNT OF CUSTOMER],
           a.[RefMonthStart],
           a.[RefMonthEnd],
           b.Days Days,
           ROW_NUMBER() OVER ( ORDER BY a.[ID] ASC) i
    FROM [dbo].[ATMONTH] a
    INNER JOIN dbo.MonthsAndDays b
    ON a.[Month] = b.[Month]
)
,
ResultSet AS
(
    SELECT ID,
           Month,
           [COUNT OF CUSTOMER],
           @refmonthstart AS RefMonthStart,
           Days   @refmonthstart AS RefMonthEnd,
           i
    FROM CTE
    WHERE i = 1

    UNION ALL

    SELECT  T.ID,
            T.Month,
            T.[COUNT OF CUSTOMER],
            R.RefMonthEnd   1,
            T.Days   R.RefMonthEnd,
            T.i
    FROM ResultSet R
    INNER JOIN CTE T
    ON  R.i   1 = T.i 

)
SELECT *
FROM ResultSet
OPTION (MAXRECURSION 1000)
  

Запрос будет рекурсивно вычислять значение refmonthstart и refmonthend . Установите значение MAXRECURSION в зависимости от количества строк, которые у вас есть в таблице.
Вы можете установить начальное значение refmonthstart, где объявлено @refmonthstart, я установил для него значение 0 (ноль)