Как сгенерировать идентификаторы на основе значений столбцов - PullRequest
0 голосов
/ 28 мая 2020

Я предоставлю примеры и код, где смогу. Предположим, что все, кроме типов данных [CycleStart] и [CycleEnd], являются Varchar, на данном этапе я не особо беспокоюсь об этом.

Таблица A состоит из следующих образцов данных RAW:

+-------+---------+----------------+------------+------------+
| JobID | JobName | CycleDesc      | CycleStart | CycleEnd   | 
+-------+---------+----------------+------------+------------+
| 10003 | Run1    | January 2019   | 31/12/2018 | 31/12/2018 |
| 10005 | Run2    | December 2018  | 31/12/2017 | 31/11/2018 |    
| 10006 | Run3    | March 2019     | 31/12/2018 | 31/02/2019 |    
| 10007 | Run4    | September 2019 | 31/12/2018 | 31/09/2019 |  
| 10008 | Run5    | November 2019  | 31/12/2018 | 31/10/2019 |     
+-------+---------+----------------+------------+------------+

Таблица B состоит из следующих образцов данных и кода, используемого для сгенерируйте эти данные ниже:

+-------+---------+---------+
| JobID | PeriodID | Entity |
+-------+---------+---------+
| 10003 | 202101   | XYZ1   |
| 10003 | 202112   | XYZ2   |   
| 10007 | 202008   | XYZ3   |   
| 10007 | 202003   | XYZ4   |   
| 10008 | 201904   | XYZ5   |   
+-------+----------+--------+
Declare  @Counter3 INT

SELECT @Counter3=1

WHILE @Counter3 <= 1000
BEGIN

INSERT INTO [dbo].[TableB]

SELECT
FLOOR(RAND()*(33979-1+1))+1 [JobID]
,CAST(ROUND(((2021 - 2019 -1) * RAND() + 2020), 0) AS VARCHAR) + RIGHT('0'+CAST(FLOOR(RAND()*(12-1+1))+1 AS VARCHAR),2) [PeriodID]
,FLOOR(RAND()*(23396-1+1))+1 [Entity]

Проблема находится в столбце таблицы B [PeriodID]. Этот столбец представляет собой идентификатор, сгенерированный из [CycleStart] в таблице A, например, 31/12/2018 = 201812 (ГГГГММ).

То, что я хочу показать в Таблице B - это идентификатор периода для каждого идентификатора задания, но показать КАЖДЫЙ месяц + 30 лет до даты [CycleStart]. Примерная таблица того, чего я хочу достичь:

+-------+---------+---------+
| JobID | PeriodID | Entity |
+-------+---------+---------+
| 10006 | 201812   | XYZ1   |
| 10006 | 201901   | XYZ2   |   
| 10006 | 201902   | XYZ3   |   
| 10006 | 201903   | XYZ4   |   
| 10006 | 201904   | XYZ5   |  
| 10006 | 201905   | XYZ5   |
| 10006 | 201906   | XYZ5   |
| 10006 | 201907   | XYZ5   |
| ...   | +30yrs   | ...    |
| 10006 | 204812   | XYZ5   |
+-------+----------+--------+

Как я могу этого добиться? В настоящее время я просто произвольно генерирую идентификаторы, которые не связаны с датой [CycleStart], и поэтому просто искажаю мои данные, но это единственный способ, которым я могу это сделать.

1 Ответ

2 голосов
/ 28 мая 2020

Лучший способ - создать календарную таблицу / измерение даты. Вы можете использовать эту таблицу для решения этой проблемы, а затем повторно использовать ее для решения других задач. (Поищите в Интернете несколько примеров того, как его построить).

Если у вас есть эта таблица, вам нужно только присоединиться к этой таблице, и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...