1

私はMicrosoftSQLを使用しています

以下のようなテーブルCR_INVLINESがあります

STOCKCODE     QTY   BARCODE  
GUITAR101     3     456812313
DESK          1     568123122
LAMP          2     845646962

私が返す必要があるのは、以下のような数量の倍数の行です。

STOCKCODE       BARCODE
GUITAR101       456812313
GUITAR101       456812313
GUITAR101       456812313
DESK            568123122
LAMP            845646962
LAMP            845646962
4

2 に答える 2

1

さて、これには、数値テーブルが必要です。これは、多くの場合に機能する迅速で簡単なソリューションです。

with numbers as (
       select row_number() over (order by (select null)) as num
      )
select il.stockcode, barcode
from CR_INVLINES il join
     numbers n
     on il.qty <= n.num

より正式な答えは次のようになります。

with digits as (
     select 0 as d union all select 1 union all select 2 union all select 3 union all select 4 union all
     select 5 union all select 6 union all select 7 union all select 8 union all select 9
   ),
   numbers as (
    select d1.d*100+d2.d*10+d3.d
    from digits d1 cross join digits d2 cross join digits d3
   )
select il.stockcode, barcode
from CR_INVLINES il join
     numbers n
     on il.qty < n.num

(数字のセットが0になっているため、に<=変更されていることに注意してください。 )<

于 2013-02-12T01:55:59.030 に答える
1

再帰CTEを使用して、次の結果を得ることができます。

;WITH CTE AS
(
    SELECT *
    FROM CR_INVLINES
    UNION ALL 
    SELECT stockcode, qty-1, BARCODE
    FROM CTE
    WHERE qty-1 >= 1
)
SELECT STOCKCODE, Barcode
FROM CTE
order by stockcode
OPTION(MAXRECURSION 0);

SQL FiddlewithDemoを参照してください

これにより、次の結果が得られます。

| STOCKCODE |   BARCODE |
-------------------------
|      DESK | 568123122 |
| GUITAR101 | 456812313 |
| GUITAR101 | 456812313 |
| GUITAR101 | 456812313 |
|      LAMP | 845646962 |
|      LAMP | 845646962 |
于 2013-02-12T02:05:00.143 に答える