Sql server 如何基于列值生成ID
我将提供例子和代码,我可以。假设除了[CycleStart]和[CycleEnd]数据类型之外的所有数据类型都是Varchar,我在这个阶段对此不太在意 表A由以下原始样本数据组成:Sql server 如何基于列值生成ID,sql-server,Sql Server,我将提供例子和代码,我可以。假设除了[CycleStart]和[CycleEnd]数据类型之外的所有数据类型都是Varchar,我在这个阶段对此不太在意 表A由以下原始样本数据组成: +-------+---------+----------------+------------+------------+ | JobID | JobName | CycleDesc | CycleStart | CycleEnd | +-------+---------+------------
+-------+---------+----------------+------------+------------+
| 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 |
+-------+----------+--------+
我怎样才能做到这一点?目前,我只是随机生成与[CycleStart]日期无关的ID,因此只是扭曲我的数据,但这是我能想到的唯一方法 最好的方法是创建日历表/日期维度。您可以使用此表解决此问题,并在以后将其用于其他问题。(在线搜索一些关于如何构建的示例) 如果你有这个表,那么你只需要加入这个表就可以了 e、 g
最好的方法是创建日历表/日期维度。您可以使用此表解决此问题,并在以后将其用于其他问题。(在线搜索一些关于如何构建的示例) 如果你有这个表,那么你只需要加入这个表就可以了 e、 g
@nbk im使用microsoft SQL server 2012,如果这是你的意思?@nbk im使用microsoft SQL server 2012,如果这是你的意思?
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]
+-------+---------+---------+
| 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 |
+-------+----------+--------+
INSERT INTO TableB ( JobID , PeriodID)
SELECT DISTINCT A.JobID , D.TheYear * 100 + D.TheMonth
FROM tableA A
JOIN myDateTable D
ON D.TheDate BETWEEN CONVERT(date , A.CycleStart , 103) AND DATEADD(YEAR,30, CONVERT(date , A.CycleStart , 103));