2010-04-07 5 views
0

J'ai une table comme ceci:Comment ajouter des lignes supplémentaires pour un jeu de résultats par condition

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

Je dois ajouter des lignes à jeu de résultats pour objID de, où il n'y a pas de données à « 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 

Quelle est la meilleure façon de procéder?

Voici le script T-SQL pour la table initiale:

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 

Répondre

1

OK, je comprends maintenant :-) Vous voulez trouver les valeurs qui ont objId pas d'entrée avec une date de 2010-05- 01 puis insérer des lignes supplémentaires avec les objID et cette date et une valeur NULL - utiliser un CTE (expression de table commune):

;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 

Le CTE MissingObj obtient toutes les objId valeurs où il n'y a pas d'entrée pour « 2010-05 -01 ', puis en utilisant cette liste d'objId , l'instruction INSERT suivante insère celles-ci dans votre table @datesTable.

Comme un côté note: Je trouve cette approche beaucoup plus facile pour remplir des tables d'échantillons:

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 vous permet de transmettre plusieurs tuples de valeurs (....) - beaucoup plus facile et plus lisible qu'une union définissent tous ...

+0

Il n'y a pas de valeurs supplémentaires. Quand il n'y a pas de données pour ObjId à '20100501', je viens d'ajouter une valeur nulle, comme ceci: ** 100 '20100501' null **. Si vous regardez cette déclaration, vous pouvez voir le format de la date: déclarer la table @datesTable (objId int, date smalldatetime, valeur int) – Puzzled

+0

Merci pour votre noeud secondaire. C'est très utile. – Puzzled

0

Cela peut être une solution:

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  
Questions connexes