Как добавить дополнительные строки в результирующий набор по условию - PullRequest
0 голосов
/ 07 апреля 2010

У меня есть такая таблица:

ObjId Date Value
100 '20100401' 12
200 '20100501' 45
200 '20100401' 37
300 '20100501' 75
300 '20100401' 69
400 '20100401' 87

Мне нужно добавить дополнительные строки в набор результатов для objId, где нет данных в '20100501'

**100 '20100501' null**
100 '20100401' 12
200 '20100501' 45
200 '20100401' 37
300 '20100501' 75
300 '20100401' 69
**400 '20100501' null**
400 '20100401' 87

Чтолучший способ сделать это?

Вот скрипт T-SQL для исходной таблицы:

declare @datesTable table (objId int, date smalldatetime, value int)
insert @datesTable
select 100, '20100401', 12
union all
select 200, '20100501', 45
union all
select 200, '20100401', 37
union all
select 300, '20100501', 75
union all
select 300, '20100401', 69
union all
select 400, '20100401', 87

select * from @datesTable

Ответы [ 2 ]

1 голос
/ 07 апреля 2010

ОК, теперь я понимаю :-) Вы хотите найти значения objId, у которых нет записи с датой 2010-05-01, а затем вставить дополнительные строки с этим objId, этой датой и значением NULL - используйте CTE (общее табличное выражение):

;WITH MissingObj AS
(
    SELECT objId 
    FROM @datesTable  d1
    WHERE NOT EXISTS (SELECT objId FROM @datesTable d2 WHERE d2.objId = d1.objId AND d2.date = '20100501')
)
INSERT INTO @datesTable(objId, date, value)
    SELECT
        mo.objId, '20100501', NULL
    FROM    
        MissingObj mo

CTE MissingObj получает все значения objId, где нет записи для '2010-05-01', а затем, используя этот список objId, следующий оператор INSERT вставляет их в вашу таблицу @datesTable.

В качестве дополнительного примечания: я считаю, что этот подход намного проще для заполнения таблиц образцов:

declare @datesTable table (objId int, date smalldatetime, value int)

insert into @datesTable(objId, date, value)
   VALUES(100, '20100401', 12),
     (200, '20100501', 45),
     (200, '20100401', 37),
     (300, '20100501', 75)  -- and so forth

SQL Server 2008 позволяет передавать несколько кортежей значений в (....) - гораздо проще и удобнее для чтения, чем конструкция объединения всех ...

0 голосов
/ 07 апреля 2010

Это может быть решением:

declare @datesTable table (objId int, date smalldatetime, value int)
insert @datesTable
select 100, '20100401', 12
union all
select 200, '20100501', 45
union all
select 200, '20100401', 37
union all
select 300, '20100501', 75
union all
select 300, '20100401', 69
union all
select 400, '20100401', 87


with objids as (
    select distinct objid
    from @datesTable )
insert into @datesTable(objId, date, value)
select D.objId, '20100501', NULL
from objids D 
where not exists(select * 
    from @datestable T
    where T.objId = D.objId
    and date = '20100501')

select *from @datesTable    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...