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 であることを示す「+」記号がある場合があります...

私の変数と部分文字列のスキルは限られています。私のマクロの考えは、「/」記号の後の最初の数字を取得し、2 番目の数字に到達するまで +1 することです。ただし、「/」記号のないレコードもあり、「+」番号の処理方法もあります。また、'/' 記号の後の最初の数字の長さは 1 ~ 4 桁です。これが基本的なことでしたら申し訳ありません。私はそこに同様の質問があることを知っていますが、私が理解するのに本当に役立つものは何もありません.

編集:

では、これについてはどうですか... order/one_item 形式について心配する必要はありません... フィールドは常に order/item-item で、スペース + などはありません...最初のアイテムを取得したい (だから'/' の後、'-' の前のすべての数字に、2 番目の項目の値に達するまで 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したがって、 およびという列を持つ というテーブルがあると仮定するOrderItemPrice、次のようにそれらを結合できます。

;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 に答える