1

query私はテーブルを持っており、そのテーブルの列の値に基づいてそのテーブルの重複した行を与えるを書きたいと思ってquantityいます。

テーブルが以下のようなものであるとします

 name | quantity
------|----------
  a   |  1
  b   |  1
  c   |  3
  d   |  2
  e   |  1

そして、次のような結果が得られるようにaqueryを書き込めるようにしたいと思います。T-SQL

 name | number | quantity
------|--------|----------
  a   |  1     |    1
  b   |  1     |    1
  c   |  1     |    3
  c   |  2     |    3
  c   |  3     |    3
  d   |  1     |    2
  d   |  2     |    2
  e   |  1     |    1

したがって、この結果では、「c」の数量が 3 であるため 3 行あり、この行が n 回表示されるたびに数値が増加します。

この質問は回答済みで受け入れられていますが、自分のシナリオに適用する方法がよくわかりません。これに関するヘルプは大歓迎です..!

4

4 に答える 4

2

数値テーブルを作成し、結合を行います。

with numbers as (
      select 1 as n
      union all
      select 1 + n
      from numbers
      where 1 + n <= 50
    )
select t.name, numbers.n, t.quantity
from t join
     numbers
     on t.quantity <= numbers.n;

これは、最大数量が 50 であることを前提としてselect max(quantity) from t)います。より柔軟にしたい場合は、入れることができます。

quantity大きくできる場合は、 を追加することをお勧めしますOPTION (MAXRECURSION 0)

于 2013-09-11T16:28:29.227 に答える
0

まず、次のように数値を含むテーブルを作成します。

CREATE TABLE dbo.Number(Num INT IDENTITY(1,1) PRIMARY KEY);
GO
INSERT INTO dbo.Number
DEFAULT VALUES; -- this will insert 10000 rows into dbo.Number table (all numbers between 1 and 10000)
GO 10000

次に、数量列に 10000 を超える値が含まれないようにするための制約を作成します。

ALTER TABLE dbo.MyTable
ADD CONSTRAINT CK_MyTable_Quantity CHECK(Quantity BETWEEN 1 AND 10000); 

そして解決策:

SELECT t.*, ROW_NUMBER() OVER(PARTITION BY t.name ORDER BY @@SPID) AS number
FROM dbo.MyTable t INNER JOIN dbo.Number n ON t.Quantity <= n.Num;

注 #1: このソリューションでは、Quantity 列が必須 (NOT NULL) であり、整数データ型 ([TINY|SMALL|BIG]INT、NUMERIC|DECIMAL(p,0)) であると想定しています。

注 #2: このソリューションでは、最小 QTY が 1 で、最大 QTY が 10000 であると想定しています。

于 2013-09-11T16:48:45.940 に答える