2017-02-14 8 views
0

Я работаю над запросом, где мне нужно отобразить n номеров записей на основе значения столбца.SQL-запрос для отображения количества записей на основе значения столбца

E.g. моя входная таблица, как показано ниже

ITMREF_0 STOFCY_0 ITCSEQ_0 VLTTOT_0 
110205  11   7   7.00000 
110205  18   1   22.30130 
110206  11   5   0.00000 

Выходной Я хочу то, что значения в 3-м столбца для отдельного значения столбца 1-й столбца .. значение столбца первого столбца будет повторяться, что раз.

E.g. У нас есть два разных числа для столбца 1 (ITMREF_0). 110205 and 110206

Для 110205 существуют два разных значения в 3-х столбцах, то есть 7 и 1. Это означает, что второй и 4-й колонны для 110205 будет повторяться от 1 до 7, то для 1

так, что вывод должен быть

ITMREF_0 STOFCY_0 ITCSEQ_0 VLTTOT_0 
110205  11   1  7.00000 
110205  11   2  7.00000 
110205  11   3  7.00000 
110205  11   4  7.00000 
110205  11   5  7.00000 
110205  11   6  7.00000 
110205  11   7  7.00000 
110205  18   1  22.30130 
110206  11   1  0.00000 
110206  11   2  0.00000 
110206  11   3  0.00000 
110206  11   4  0.00000 
110206  11   5  0.00000 

ответ

1

Это довольно легко сделать с помощью таблицы чисел или чисел cte:

rextester: http://rextester.com/UCEM72371

create table t (
    ITMREF_0 int 
    , STOFCY_0 int 
    , ITCSEQ_0 int 
    , VLTTOT_0 decimal(19,6) 
); 
insert into t values 
    (110205 ,11 ,7 ,7) 
    , (110205 ,18 ,1 ,22.3013) 
    , (110206 ,11 ,5 ,0) ; 

номера КТР:

/* numbers table */ 
with a as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n)) 
, numbers as (
    select n = row_number() over (order by (select 1)) 
    from   a as deka 
     cross join a as hecto 
     cross join a as kilo 
     --cross join a as [tenK] 
     --cross join a as [hundredk] 
     --cross join a as mega 
    ) 

запроса:

select 
    t.ITMREF_0 
    , t.STOFCY_0 
    , ITCSEQ_0 = n 
    , VLTTOT_0 
from t 
    inner join numbers 
    on numbers.n <= t.ITCSEQ_0 
order by 
    t.ITMREF_0 
    , t.STOFCY_0 
    , n 

результаты:

+----------+----------+----------+-----------+ 
| ITMREF_0 | STOFCY_0 | ITCSEQ_0 | VLTTOT_0 | 
+----------+----------+----------+-----------+ 
| 110205 |  11 |  1 | 7,000000 | 
| 110205 |  11 |  2 | 7,000000 | 
| 110205 |  11 |  3 | 7,000000 | 
| 110205 |  11 |  4 | 7,000000 | 
| 110205 |  11 |  5 | 7,000000 | 
| 110205 |  11 |  6 | 7,000000 | 
| 110205 |  11 |  7 | 7,000000 | 
| 110205 |  18 |  1 | 22,301300 | 
| 110206 |  11 |  1 | 0,000000 | 
| 110206 |  11 |  2 | 0,000000 | 
| 110206 |  11 |  3 | 0,000000 | 
| 110206 |  11 |  4 | 0,000000 | 
| 110206 |  11 |  5 | 0,000000 | 
+----------+----------+----------+-----------+ 
2
with  cte as 
      (
       select * 
       from mytable 

       union all 

       select ITMREF_0,STOFCY_0,ITCSEQ_0 - 1,VLTTOT_0 
       from cte 
       where ITCSEQ_0 > 1 
      ) 
select  * 
from  cte 
order by ITMREF_0,STOFCY_0,ITCSEQ_0 

+----------+----------+----------+----------+ 
| ITMREF_0 | STOFCY_0 | ITCSEQ_0 | VLTTOT_0 | 
+----------+----------+----------+----------+ 
| 110205 | 11  | 1  | 7.00  | 
+----------+----------+----------+----------+ 
| 110205 | 11  | 2  | 7.00  | 
+----------+----------+----------+----------+ 
| 110205 | 11  | 3  | 7.00  | 
+----------+----------+----------+----------+ 
| 110205 | 11  | 4  | 7.00  | 
+----------+----------+----------+----------+ 
| 110205 | 11  | 5  | 7.00  | 
+----------+----------+----------+----------+ 
| 110205 | 11  | 6  | 7.00  | 
+----------+----------+----------+----------+ 
| 110205 | 11  | 7  | 7.00  | 
+----------+----------+----------+----------+ 
| 110205 | 18  | 1  | 22.30 | 
+----------+----------+----------+----------+ 
| 110206 | 11  | 1  | 0.00  | 
+----------+----------+----------+----------+ 
| 110206 | 11  | 2  | 0.00  | 
+----------+----------+----------+----------+ 
| 110206 | 11  | 3  | 0.00  | 
+----------+----------+----------+----------+ 
| 110206 | 11  | 4  | 0.00  | 
+----------+----------+----------+----------+ 
| 110206 | 11  | 5  | 0.00  | 
+----------+----------+----------+----------+ 
0
Select A.ITMREF_0 
     ,A.STOFCY_0 
     ,ITCSEQ_0 = B.N 
     ,A.VLTTOT_0 
From YourTable A 
Cross Apply (Select Top (A.ITCSEQ_0) N=Row_Number() Over (Order By Number) From master..spt_values) b 

Возвращает

ITMREF_0 STOFCY_0 ITCSEQ_0 VLTTOT_0 
110205  11   1   7.000000 
110205  11   2   7.000000 
110205  11   3   7.000000 
110205  11   4   7.000000 
110205  11   5   7.000000 
110205  11   6   7.000000 
110205  11   7   7.000000 
110205  18   1   22.301300 
110206  11   1   0.000000 
110206  11   2   0.000000 
110206  11   3   0.000000 
110206  11   4   0.000000 
110206  11   5   0.000000 
Смежные вопросы