上記のように、2 つの列と、たとえば 3 つの行を持つテーブルがあります。次に、このテーブルにビューを作成します。
このビューは、テーブルの各行に対して、この行に書かれている行数と同じ数の行を表示する必要があります。
この問題を解決する方法がわかりません。TSQL を使用してビューを作成する方法の例を教えてください。
例:
次のように、再帰 CTE を使用して値を分割できます。
;WITH CTE AS
(
SELECT name, value
FROM YourTable
UNION ALL
SELECT name, value-1
FROM CTE
WHERE value-1 >= 1
)
SELECT t.name, t.value
FROM yourtable t
inner join CTE c
on t.name = c.name
ORDER BY name, value
OPTION(MAXRECURSION 0)
デモで SQL Fiddle を参照してください
結果は次のとおりです。
| NAME | VALUE |
-----------------
| milk | 4 |
| milk | 4 |
| milk | 4 |
| milk | 4 |
| sugar | 2 |
| sugar | 2 |
| tea | 7 |
| tea | 7 |
| tea | 7 |
| tea | 7 |
| tea | 7 |
| tea | 7 |
| tea | 7 |
WITH q(n) AS
(
SELECT 1
UNION ALL
SELECT n + 1
FROM q
WHERE n <
(
SELECT MAX(repeats)
FROM mytable
)
)
SELECT t.*
FROM mytable t
JOIN q
ON q.n <= t.repeats
このテーブルを、1、2、3、4、5、6、....の数字のフィールドを持つテーブルと結合する必要があります。例えば:
with t0 as
( select 1 n
union all
select 2 n
union all
select 3 n
),
tCount as
(select ROW_number() over (order by t1.n) rn
from t0,
t0 as t1,
t0 as t2,
t0 as t3,
t0 as t4
)
select t.* from t
join tCount on t.Number>=tCount.rn
order by name
チェックしてください
;WITH T AS(
SELECT
COl1, Col2, 1 AS NUM
FROM TableName
UNION ALL
SELECT
T1.COl1, T1.Col2, T.NUM+1 AS NUM
FROM TableName T1 INNER JOIN T ON T1.Col1=T.Col1
WHERE T.NUM+1<=T1.Col2
)
SELECT COl1, Col2 FROM T ORDER BY COl1