我有一个表,其中包含具有日期的行的列表,唯一的ID是(日期,时间和参考的串联)。加上一列包含f个项目的列。

sql-server - 将表格中的一行拆分为多行-LMLPHP

我希望能够将此数据拆分为下图所示的数据。因此,根据列出的项目数,将上面数据中的每一行分开。例如'142691'有11个项目,所以我想将其拆分为11个项目,但

如您所见,由于某些引用可能具有多个条目(如“142692”),因此每个条目都会创建唯一ID,因此时间会增加一分钟。

sql-server - 将表格中的一行拆分为多行-LMLPHP

如果有人可以提供帮助,我将不胜感激。

我尝试了以下方法:

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/

10-11 01:27