0

所以我有一个看起来像这样的表:

Order/item       Price
2001/1-10        $1000
2001/11-13       $ 500 
2002/1-20 + 22   $2500
2003             $2000

我想从订单/项目中获取数据并创建一个看起来像这样的范围:

Order/item
2001/1
2001/2
2001/3

依此类推...如您所见,可能有一个“+”号表示范围是 xy 和 z...

我的变量和子串技能是有限的。我的宏观想法是在“/”符号后面取第一个数字,然后 +1,直到我得到第二个数字。但是也有没有'/'号的记录,然后如何处理'+'号。'/' 符号后面的第一个数字也可以是 1-4 位数的长度。对不起,如果这是基本的。我知道那里有类似的问题,但没有什么能真正帮助我理解。

编辑:

那么这个呢...不用担心订单/ one_item格式...可以说该字段将始终是订单/项目-项目,没有空格+等...。我想拿第一个项目(所以'/' 之后但 '-' 之前的所有数字,然后将 1 添加到它,直到我达到第二个项目值。所以表格看起来像这样:

order/item    new_col
2001/1-10      1
2001/1-10      2
2001/1-10      3
2001/1-10      4
2001/1-10      5
2001/1-10      6
2001/1-10      7
2001/1-10      8
2001/1-10      9
2001/1-10      10

我认为这应该更容易做到。

4

2 回答 2

0

您可以创建一个函数来获取每一行的范围

CREATE FUNCTION dbo.GetRange (@range varchar(10))
RETURNS @RangeTable TABLE (RangeNumber int) AS BEGIN

    DECLARE @StartRange int, @EndRange int

    SELECT @StartRange = SUBSTRING(@range, CHARINDEX('/', @range, 0) + 1, CHARINDEX('-', @range, 0) - CHARINDEX('/', @range, 0) - 1),
        @EndRange = SUBSTRING(@range, CHARINDEX('-', @range, 0) + 1, LEN(@range))

    WHILE @StartRange <= @EndRange BEGIN
        INSERT INTO @RangeTable (RangeNumber) VALUES (@StartRange)
        SET @StartRange = @StartRange + 1
    END

    RETURN
END
GO

然后在您选择的原始表格中加入这个

SELECT * FROM OrderItemTable 
CROSS APPLY dbo.GetRange(OrderItem)

您可能可以修改 GetRange 函数来处理您的其他一些情况(+、无范围等)。

于 2015-02-24T17:39:18.527 回答
0

这应该适用于您的简化版本。CTE 生成(大)范围的数字,然后将其连接回已拆分为其组成部分的字符串。

DECLARE @OrderItem VARCHAR(100) = '2001/1-10'

;WITH Nums AS
(
  SELECT n = ROW_NUMBER() OVER (ORDER BY [object_id]) 
  FROM sys.all_objects 

)
SELECT  SUBSTRING(@OrderItem, 0, CHARINDEX('/', @OrderItem)),
        n
FROM nums
WHERE n BETWEEN CAST(SUBSTRING(SUBSTRING(@OrderItem, 6, 100), 0, CHARINDEX('-', SUBSTRING(@OrderItem, 6, 100))) AS INT)
AND CAST(SUBSTRING(SUBSTRING(@OrderItem, 6, 100), CHARINDEX('-', SUBSTRING(@OrderItem, 6, 100))+1, 100) AS INT)

因此,假设您有一个名为的表Orders,其中包含名为OrderItemand的列Price,那么您可以像这样将它们连接在一起:

;WITH Nums AS
(
  SELECT n = ROW_NUMBER() OVER (ORDER BY [object_id]) 
  FROM sys.all_objects 

)

SELECT  SUBSTRING(Orders.OrderItem, 0, CHARINDEX('/', Orders.OrderItem)) AS [Order],
        n AS Item,
        Price
FROM Orders
CROSS APPLY nums
WHERE n BETWEEN CAST(SUBSTRING(SUBSTRING(Orders.OrderItem, 6, 100), 0, CHARINDEX('-', SUBSTRING(Orders.OrderItem, 6, 100))) AS INT)
AND CAST(SUBSTRING(SUBSTRING(Orders.OrderItem, 6, 100), CHARINDEX('-', SUBSTRING(Orders.OrderItem, 6, 100))+1, 100) AS INT)
于 2015-02-24T17:34:53.430 回答