2016-12-08 11 views
1

У меня есть существующие данные, такие какгенерировать номер серии для новых записей на основе существующих данных

+-------+-----+----------+ 
| House | Pet | ItemCode | 
+-------+-----+----------+ 
| A  | Cat | ACat001 | 
| A  | Dog | ADog001 | 
| B  | Cat | BCat001 | 
| A  | Dog | ADog002 | 
+-------+-----+----------+ 

Я хочу, чтобы генерировать новые коды позиций для новых записей от T-SQL, как

+-------+-----+----------+--------------------------------+ 
| House | Pet | ItemCode | ItemCodes supposed to generate | 
+-------+-----+----------+--------------------------------+ 
| A  | Cat | ????  | ACat002      | 
| C  | Dog | ????  | CDog001      | 
+-------+-----+----------+--------------------------------+ 

Пожалуйста, помогите.

+1

Какова логика этого результата? – FLICKER

+0

, который проголосовал за этот вопрос, в аренду, пожалуйста, сообщите нам ожидаемую логику для этого вывода !! –

+0

Пользователь хочет построить логику для генерации нового кода элемента для новых вставленных данных на основе дома и домашнего животного. поэтому недавно вставленная кошка в доме A будет иметь код элемента ACat002, поскольку кошка в доме A уже существует. – ughai

ответ

1

Я хотел бы предложить, чтобы сохранить еще один столбец как Index так, чтобы сломать элемент кода в House, Pet и Index и создать itemcode из них, а также столбец идентификации в качестве первичного ключа в таблице, которая сделала бы решение проще и лучше в производительности.

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

Таблица Сценарии и Вставки

CREATE TABLE HousePet 
    ([House] varchar(1), [Pet] varchar(3), [ItemCode] varchar(7)); 

INSERT INTO HousePet 
    ([House], [Pet], [ItemCode]) 
VALUES 
    ('A', 'Cat', 'ACat001'), 
    ('A', 'Dog', 'ADog001'), 
    ('B', 'Cat', 'BCat001'), 
    ('A', 'Dog', 'ADog002'); 

-- new rows inserted for which `ItemCode` is required 
INSERT INTO HousePet 
    ([House], [Pet], [ItemCode]) 
    VALUES 
    ('A', 'Cat', NULL), 
    ('C', 'Dog', NULL); 

Обновление SQL

;WITH HousePetIndex AS 
(
    SELECT House,Pet,MAX(CONVERT(INT,REPLACE(ItemCode,House + Pet,''))) as MaxIndex 
    FROM HousePet 
    WHERE ItemCode IS NOT NULL 
    GROUP BY House,Pet 
), HousePetInserted as 
(
    SELECT HP.House,HP.Pet,HP.ItemCode,ROW_NUMBER()OVER(PARTITION BY HP.House,HP.Pet ORDER BY HP.House) as ItemIndex 
    FROM HousePet HP 
    WHERE ItemCode IS NULL 
) 
UPDATE HP1 
SET ItemCode = HP1.House + HP1.Pet + RIGHT('000'+ CONVERT(VARCHAR(2),ItemIndex + ISNULL(HP2.MaxIndex,0)),3) 
FROM HousePetInserted HP1 
LEFT JOIN HousePetIndex HP2 
    ON HP1.House = HP2.House AND HP1.Pet = HP2.Pet 

SELECT * FROM HousePet 

Logic

  • Получить максимальный индекс для существующих данных на дом и домашнее животное в HousePetIndex КТРЕ
  • Определить новые строки с некоторым индексом на основе row_number в случае, если несколько строк для того же домашних животных и дома вставлены
  • Обновления itemcode для новых строк на основе House, Pet и Index, полученных от максимального индекса и индекса или новые строки

OUTPUT

House Pet ItemCode 
A Cat ACat001 
A Dog ADog001 
B Cat BCat001 
A Dog ADog002 
A Cat ACat002 
C Dog CDog001 

EDIT

Если вы решили добавить itemindex и идентификатор столбца ID, вы можете сделать ItemCode в качестве вычисляемого столбца.

CREATE TABLE HousePet 
(
    ID INT IDENTITY(1,1) PRIMARY KEY, 
    [House] varchar(1), 
    [Pet] varchar(3), 
    [ItemIndex] INT, 
    [ItemCode] AS (House + Pet + RIGHT('000'+ CONVERT(VARCHAR(2),ItemIndex),3)) 
); 

вы можете сделать что-то вроде этого

UPDATE T 
SET ItemIndex = rn + MaxIndex 
FROM 
(
    SELECT ID,House,Pet,ItemIndex,ROW_NUMBER()OVER(PARTITION BY House,Pet ORDER BY ID ASC) rn 
    FROM HousePet 
    WHERE ItemIndex IS NULL 
)T 
INNER JOIN 
(
    SELECT House,Pet,ISNULL(MAX(ItemIndex),0) as MaxIndex 
    FROM HousePet 
    GROUP BY House,Pet 
) MaxIndexTable 
ON MaxIndexTable.House = T.House AND MaxIndexTable.Pet = T.Pet 
+0

Благодаря решению. Итак, новая таблица должна состоять из 4 столбцов House, Pet, Index и ItemCode (PrimaryKey), правильно? –

+0

Ваш первичный ключ должен быть отдельным столбцом «ID», предпочтительно столбцом «ИДЕНТИФИКАЦИЯ». если вы входите в создание такой таблицы, ваш столбец «ItemCode» может быть просто вычисляемым столбцом на основе «House», «Pet», «Index», и вам просто нужно «обновить» индекс в этом дело. – ughai

+0

Я понимаю. Спасибо. –

Смежные вопросы