2 votes

Retourner les résultats qui ne correspondent pas à la jointure SQL Server

Se référer à ce document http://sqlfiddle.com/#!18/8fe2a/13

J'ai des tables

CREATE TABLE Figure(
MonthNumber varchar(10),
Code varchar(10),
Figure int
);

INSERT INTO Figure (MonthNumber, Code, Figure)
VALUES ('5', 'S', '25'),
('5','G', '30');

CREATE TABLE Other(
MonthNumber varchar(10),
Code varchar(10),
Figure int
);

INSERT INTO Other (MonthNumber, Code, Figure)
VALUES ('5', 'S', '25'),
('5','G', '30'),
('4','K', '40'),
('3','D', '20'),
('2','J', '25');

Requête :

SELECT * FROM
Figure f1
RIGHT JOIN 
Other O
ON F1.[Code] = O.[Code]
OR 
o.[MonthNumber] = MONTH(GETDATE())-1
WHERE f1.[MonthNumber] = MONTH(GETDATE())

Résultat :

| MonthNumber | Code | Figure | MonthNumber | Code | Figure |
|-------------|------|--------|-------------|------|--------|
|           5 |    S |     25 |           5 |    S |     25 |
|           5 |    S |     25 |           4 |    K |     40 |
|           5 |    G |     30 |           5 |    G |     30 |
|           5 |    G |     30 |           4 |    K |     40 |

Cependant, je cherche à obtenir les résultats de ce mois-ci, mais aussi à inclure les personnes qui ont pu avoir un chiffre pour les mois précédents, mais pas pour ce mois-ci.

Résultat souhaité :

| MonthNumber | Code | Figure |
|-------------|------|--------|
|           5 |    S |     25 |
|           5 |    G |     25 |
|           5 |    K |      0 |
|           5 |    D |      0 |
|           5 |    J |      0 |

Je n'arrive pas à savoir ce dont j'ai besoin au niveau de la jonction. Toute aide serait appréciée.

1voto

Gordon Linoff Points 213350

Vous semblez vouloir une telle logique :

SELECT MONTH(GETDATE()) as MonthNumber, 
       MONTH(GETDATE()) as Code,
       f.Figure
FROM (SELECT DISTINCT code FROM Other) c LEFT JOIN
     Other o 
     ON c.Code = o.Code LEFT JOIN
     Figure f
     ON f.[Code] = c.[Code] AND
        f.[MonthNumber] = MONTH(GETDATE())
ORDER BY figure desc;

Ici est le violon SQL. Je n'ai pas pris la peine de mettre le COALESCE() pour les Figure . NULL semble être une valeur de retour appropriée.

0voto

Rahul Jain Points 1149

Essayez ceci

SELECT 
    O.* 
FROM
    Figure f1
RIGHT JOIN 
    Other O
ON 
    F1.[Code] = O.[Code]
AND 
    (
        f1.[MonthNumber] = MONTH(GETDATE())
    OR 
        (
            o.[MonthNumber] = MONTH(GETDATE())-1
        AND 
            f1.[MonthNumber] != MONTH(GETDATE())
        )
    )

Demo

http://sqlfiddle.com/#!18/8fe2a/44

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X