我有一个表,其中包含具有日期的行的列表,唯一的ID是(日期,时间和参考的串联)。加上一列包含f个项目的列。
我希望能够将此数据拆分为下图所示的数据。因此,根据列出的项目数,将上面数据中的每一行分开。例如'142691'有11个项目,所以我想将其拆分为11个项目,但
如您所见,由于某些引用可能具有多个条目(如“142692”),因此每个条目都会创建唯一ID,因此时间会增加一分钟。
如果有人可以提供帮助,我将不胜感激。
我尝试了以下方法:
DECLARE @COUNT INT
SET @count = 0
DECLARE @add TABLE (ID BIGINT, REF INT, DATE INT, PERIOD INT, TIME VARCHAR(12), ITEMS INT)
WHILE (@count < (SELECT DURATION FROM @add))
BEGIN
INSERT INTO @add
SELECT @COUNT
SET @count = (@count + 1)
END
DECLARE @SPLITRW TABLE (ID BIGINT, REF INT, DATE INT, PERIOD INT, TIME VARCHAR(12), ITEMS INT)
INSERT INTO @SPLITRW
(ID, REF, DATE, PERIOD,TIME, ITEMS)
SELECT ID, REF, DATE, PERIOD, (TIME + @COUNT), ITEMS
FROM dbo.dataset
SELECT ID, REF, DATE, PERIOD, TIME , items
FROM @SPLITRW SR
INNER JOIN @add AD
ON AD.ID BETWEEN 1 AND AD.items
最佳答案
如果您没有数字或提示表,则可以使用临时提示表。
示例
Select A.ID
,A.Ref
,A.Date
,A.Period
,Time=dateadd(MINUTE,N,A.Time)
,A.Items
From YourTable A
Join ( Select Top 1000 N=Row_Number() Over (Order By (Select NULL))-1
From master..spt_values n1, master..spt_values n2
) B on B.N<=A.Items
您可能会注意到我在子查询中
**Select TOP 1000**
。您可以将其调整为更合理/最大的数字。或者你可能有 ...
Join ( Select Top (Select 1+max(Items) from YourTable) N=Row_Number() Over (Order By (Select NULL))-1
From master..spt_values n1, master..spt_values n2
) B on B.N<=A.Items
使用spt_values的子查询(可以是任何适当大小的表)仅生成一个从0到9999的临时统计表。然后,我们将您的数据限制为ITEMS,以创建一个1-many。我们还使用N来增加您的TIME。
关于sql-server - 将表格中的一行拆分为多行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49703318/