2015-12-12 5 views
2

У меня есть таблица, где витрин я есть пробелы в rows.I пытались использовать условие цикла, но я не в состоянии продолжитькак заполнить пробелы в строках в таблице

CREATE TABLE Mart 
    (martID int, mart int) 
; 

INSERT INTO Mart 
    (martID, mart) 
VALUES 
    (1, 10), 
    (4, 12), 
    (6, 20) 
; 

Выходной

martID  mart 
1    10 
2    0 
3    0 
4    12 
5    0 
6    20 

Мой код до сих пор

select max(martId) as nr 
     from Mart 
     union all 
     select nr - 1 
     from numbers 
     where nr > 1 
+1

Что вы подразумеваете под пробелами? –

+0

строки должны быть последовательным порядком по ID –

+0

. Вы должны добавить первичный ключ –

ответ

0

может быть это работает

declare @Mart TABLE 
    (martID int, mart int) 
; 

INSERT INTO @Mart 
    (martID, mart) 
VALUES 
    (1, 10), 
    (4, 12), 
    (6, 20) 
; 
declare @MinNo int 
declare @MaxNo int 
declare @IncrementStep int 
set @MinNo = 1 
set @MaxNo = 10 
set @IncrementStep = 1 

;with C as 
(
    select @MinNo as Num 
    union all 
    select Num + @IncrementStep 
    from C 
    where Num < @MaxNo 
)  
select Num, 
CASE WHEN mart IS NOT NULL THEN mart ELSE 0 END AS NUMBER 
from C 
LEFT JOIN @Mart t 
ON t.martID = c.Num 
+0

, когда данные изменяют состояние условия становится проблемой @ mohan111 –

+0

да, но в соответствии с вашими предполагаемыми данными я дал код вроде этого @manasasai – mohan111

+0

спасибо! Он работает @ mohan111 –

1

Надеюсь, вы Number таблица содержит S без пробелов. Попробуйте

SELECT nr, 
     COALESCE(mart, 0) AS mart 
FROM numbers n 
     LEFT OUTER JOIN mart m 
        ON m.martid = n.nr 
WHERE n.nr BETWEEN (SELECT Min(martid) 
        FROM mart) AND (SELECT Max(martid) 
             FROM mart) 

В случае, если вы не numbers таблицы, то обратитесь в этом link генерировать последовательность значений в SQL Server. Я предпочитаю STACKED CTE метод

;WITH e1(n) AS 
(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
), -- 10 
e2(n) AS (SELECT 1 FROM e1 CROSS JOIN e1 AS b), -- 10*10 
e3(n) AS (SELECT 1 FROM e1 CROSS JOIN e2) -- 10*100 
    SELECT n = ROW_NUMBER() OVER (ORDER BY n) FROM e3 ORDER BY n; 
+0

, можем ли мы достичь этого в состоянии цикла –

+0

, почему вы хотите использовать цикл, когда есть решение без цикла, которое эффективно –

1

Вы можете использовать код, приведенный ниже, если вы просто хотите, чтобы отобразить данные:

SELECT 
    n.MartId, 
    ISNULL(m.mart, 0) 
FROM 
    numbers n 
    LEFT JOIN Mart m ON n.MartId = m.martID 
ORDER BY 
    n.MartId 
0

Попробуйте с помощью рекурсивного ОТВ,

DECLARE @Max_var INT=(SELECT Max(martid) 
    FROM Mart); 

WITH cte 
    AS (SELECT 1 AS Value 
     UNION ALL 
     SELECT Value=Value + 1 
     FROM cte 
     WHERE (Value + 1) <= @Max_var) 
SELECT Value, 
     Isnull(mart, 0) 
FROM cte A 
     LEFT JOIN Mart B 
       ON A.Value = B.martID 
Смежные вопросы