0
votes

SQL Rejoignez les données et obtenez des lignes qui ne correspondent pas avec NULL

J'ai deux tables que je veux rejoindre comme suit:

Tableau 1 P>

 Code1 |  Code2 |  Date(1)   |   Date(2) |  Amount(1) | Amount(2)             
   A   |   AA   |   201802   |    201802 |    100     |   10      
   A   |   AA   |   201803   |    201803 |    50      |   10        


8 commentaires

Pouvez-vous nous montrer vos tentatives s'il vous plaît? C'est très difficile (impossible) pour nous de vous dire pourquoi le SQL que vous avez utilisé n'a pas fonctionné lorsque nous ne savions pas ce que SQL était.


À une conjecture, vous voulez peut-être un Joindre extérieur complet .


Et si code1 ou code2 ne correspond pas?


Est la question que pour certains des enregistrements que vous obtenez également un null code1 et code2 , que vous ne voulez pas? Si vous pouvez utiliser MOISON OUTER complet et dans votre SELECT, UTILISER ISNULL (TABLEAGE1.CODE1, TABLED2.CODE1) Comme code1 et ISNULL (TABLE1.CODE2 , table2.code2) sous forme de code2 pour s'assurer que le code est extrait de la table qui a cet enregistrement.


Pouvez-vous s'il vous plaît me montrer votre tentative qu'il sera plus facile de le corriger, je pense que vous voulez une jointure extérieure complète


Le code 1 et le code 2 doivent correspondre, mais le problème est que dans certains cas, il n'y a pas d'instance de ligne pendant une date donnée et je souhaite qu'il apparaisse avec une valeur null pour la valeur.


Avec vos données d'échantillon, le moyen d'obtenir le résultat souhaité est en effet en utilisant un Joindre complet . Toutefois, sur la base de vos derniers commentaires, où vous avez écrit "Code 1 et le code 2 doivent correspondre" Je ne suis pas sûr que ce soit la solution que vous recherchez - votre exemple de données ne couvre pas les cas où aucune de ces colonnes ne Correspondre donc nous ne pouvons pas savoir quelle est la sortie souhaitée pour une telle situation.


Découvrez cette démo pour voir ce que je veux dire.


3 Réponses :


1
votes

Vous pouvez essayer cela.

select
    coalesce(table1.Code1,table2.Code1) as Code1,
    coalesce(table1.Code2,table2.Code2) as Code2,
    table1.Date1,
    table2.Date2,
    table1.Amount1,
    table2.amount2
FROM @tab1 as Table1
    Full Outer Join @tab2 as table2 ON 
            table1.Code1 = table2.Code1
        AND table1.Code2 = table2.Code2
        AND table1.date1= table2.date2
where exists (select null --to exclude records not matched by "Code 1 and Code 2"
              from @tab2 as t2
              where coalesce(table1.Code1,table2.Code1) = t2.Code1
                    and coalesce(table1.Code2,table2.Code2) = t2.Code2)
ORDER BY   table1.Date1


2 commentaires

Essayez d'ajouter cette ligne à l'une des tables: ('B', 'AA', 201802, 100) et voyez ce qui se passe. Est-ce que les résultats souhaités? Basé sur le commentaire de l'OP à la question ("Code 1 et Code 2 doivent correspondre") probablement pas.


Je sais ce que le résultat sera, je ne suis tout simplement pas sûr de ce que veut. J'ai déjà eu la démo de réexter prêt lorsque vous avez posté votre réponse; J'attends toujours que le OP clarifie la question.



0
votes

Votre requête mise à jour doit fonctionner si vous ISnull Les colonnes CODEX.

declare @t1 table (Code1 varchar(4), Code2 varchar(4),  Date1 date, Amount1 int)
declare @t2 table (Code1 varchar(4), Code2 varchar(4),  Date2 date, Amount2 int)

insert into @t1
values
   ('A', 'AA', '2018-02-01', 100 ),     
   ('A', 'AA', '2018-03-01', 50 ),     
   ('A', 'AA', '2018-04-01', 30 )

insert into @t2
values
   ('A', 'AA', '2018-01-01', 20 ),     
   ('A', 'AA', '2018-02-01', 10 ),     
   ('A', 'AA', '2018-03-01', 10 )

SELECT 
    code1   
    ,code2  
    ,date1  
    ,date2  
    ,amount1    
    ,amount2
FROM (
    SELECT code1, code2 FROM @t1
    INTERSECT
    SELECT code1, code2 FROM @t2
) t0
CROSS APPLY (
    SELECT 
        date1, date2, amount1, amount2
    FROM @t1 t1  
    FULL OUTER JOIN @t2 t2 ON t1.Code1 = t2.Code1 and t1.Code2 = t2.Code2 and date1 = date2
    WHERE 
        t0.code1 = isnull(t1.Code1, t2.code1)
    and t0.code2 = isnull(t1.Code2, t2.code2)
) tt
ORDER BY 
    date1, date2


2 commentaires

Essayez d'ajouter cette ligne à l'une des tables: ('B', 'AA', '2018-02-01', 100) et voyez ce qui se passe. Est-ce que les résultats souhaités? Basé sur le commentaire de l'OP à la question ("Code 1 et Code 2 doivent correspondre") probablement pas.


Requête mise à jour pour accueillir la portée qui a glissé dans les commentaires



0
votes

Ma solution suggérée implique une jointure complète et une autre joindre à une table dérivée contenant toutes les combinaisons de code1 code> et code2 code> qui existe dans les deux tables, à l'aide du Intersect Code> Opérateur.

Premièrement, créez et remplissez des données d'échantillons ( s'il vous plaît strong> Sauvez-nous cette étape dans vos prochaines questions): p>

Code1   Code2   Date1   Date2   Amount1     Amount2
A       AA      NULL    201801  NULL        20
A       AA      201802  201802  100         10
A       AA      201803  201803  50          10
A       AA      201804  NULL    30          NULL


0 commentaires