SQL - Ayuda con Join TSQL

 
Vista:
sin imagen de perfil

Ayuda con Join TSQL

Publicado por Alvar (2 intervenciones) el 08/04/2015 19:16:38
Buenas.
A ver si alguien sabe cómo solucionar esta sql que me ha tenido hoy de cráneo. Pongo ejemplo:

Tabla Clientes:
Codigo...Nombre
1.............Pepe
2.............Paco
3.............Luisito

Tabla Pedidos
Numero...Cliente...FechaPedido
1001........1.............1/3/2015
1002........1.............1/4/2015
1003........3.............1/1/2015
1004........4.............1/3/2015

Buscaba un join de clientes con pedidos clásico, pero que si no encontraba el pedido, mostrase el pedido null, del tipo

Select Cliente.Codigo, Pedidos.Numero from Clientes left join Pedidos on Clientes.codigo=Pedidos.Cliente
Where Pedidos.FechaPedido>'1/2/2015'

... que diera como resultado ...
Codigo...Numero
1.............1001
1.............1002
2.............null
3.............null

Óbviamente la sql que he puesto no lo hace, y no lo puedo solucionar con subselects.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Ayuda con Join TSQL

Publicado por leonardo_josue (1173 intervenciones) el 08/04/2015 20:02:17
Hola Alvar...

Tienes sólo un pequeño detalle en la consulta, es correcto el uso del LEFT JOIN, pero en este caso, la condición de la fecha también debes incluirla en la cláusula ON. no nos dices con qué DBMS estás trabajando, pero checa este ejemplo en MySQL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
mysql> SELECT * FROM clientes;
+--------+---------+
| Codigo | Nombre  |
+--------+---------+
|      1 | Pepe    |
|      2 | Paco    |
|      3 | Luisito |
+--------+---------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM pedidos;
+--------+---------+-------------+
| Numero | Cliente | FechaPedido |
+--------+---------+-------------+
|   1001 |       1 | 2015-03-01  |
|   1002 |       1 | 2015-04-01  |
|   1003 |       3 | 2015-01-01  |
|   1004 |       4 | 2015-03-01  |
+--------+---------+-------------+
4 rows in set (0.00 sec)
 
mysql> SELECT Clientes.Codigo, Pedidos.Numero
    -> FROM Clientes
    -> LEFT JOIN Pedidos ON Clientes.codigo=Pedidos.Cliente AND
    ->                      Pedidos.FechaPedido>'2015-02-01';
+--------+--------+
| Codigo | Numero |
+--------+--------+
|      1 |   1001 |
|      1 |   1002 |
|      2 |   NULL |
|      3 |   NULL |
+--------+--------+
4 rows in set (0.00 sec)

En este caso, el LEFT JOIN tal como lo tienes, simplemente une a todos los clientes que tienen pedidos, pero en tu caso, te interesa que el pedido sea después de una fecha determinada.

Finalmente una recomendación, la mayoría (si no es que todos) los DBMS manejan las fechas con el formato ANSI (yyyy-mm-dd), por lo que te recomiendo que utilices ese estándar, pues de lo contrario, puedes tener resultados innesperados.

Dale un vistazo y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ayuda con Join TSQL

Publicado por Alvar (2 intervenciones) el 08/04/2015 20:33:22
Leo. Muchas gracias por la respuesta. Te la puntúo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar