Page 1 sur 1

Aide sur une requete SQL

Posté : 30 août 2011, 11:32
par guigui69
Bonjour à tous,
Serveur:SQL Server 2000

J'ai une demande d'une collègue (compta) pour extraire une information de notre base.
Je suis sur une requête et je bloque au niveau de la condition WHERE.

J'ai dans ma base une table avec une liste de commission.

Exemple:

Information | Date | Soldé (0 ou 1) | date paiement.
tototottoto| 01/07/2011|0|NULL
tototototot| 08/07/2011|1|30/07/2011
tototototot| 04/07/2011|1|11/08/2011
tototototto| 16/07/2011|0|NULL

==> Si la commission est soldée (1) , il y a forcement une date de paiement.

Au niveau de ma condition je voudrait ressortir:
- toutes les commissions non Soldée (0)
- de la date de 01/01/2007 au 31/07/2011

Jusqu’à la ça va j'arrive à le faire.

Mais il doit apparaitre aussi celle qui était non soldée avant le 31/07/2011 date de paiement.
Exemple:
tototototot| 04/07/2011|1|11/08/2011
N’était pas soldée au 31/07/2011

Je sais pas comment mettre cela dans ma condition WHERE.

J’espère être clair dans mes explications.

Merci d'avance pour votre aide

Re: Aide sur une requete SQL

Posté : 30 août 2011, 12:11
par Cyrano
Salut,
il faudra ajuster au niveau de la syntaxe sur les dates, ca fait longtemps que je n'ai plus touché à SQL Server, mais ta requête devrait ressembler à ceci :
SELECT
  information,
  date_info,
  solde,
  date_pmt
FROM commissions
WHERE solde = 0
   OR (
        solde = 1
    AND date_pmt > '2011-07-31'
);
Et ça devrait sembler assez évident du coup : soit la commission n'est pas soldée, soit elle l'est mais ça a été soldé à une date supérieure au 31/07/2011

Re: Aide sur une requete SQL

Posté : 30 août 2011, 17:45
par guigui69
Voici la requete en question:
SELECT 
convert(varchar,tcPresupuesto.FechaFactura,103) as datefacture,    
convert(varchar,tcPresupuestoComisreclam.Fecha,103) as Date,
tcComisReclam.Descrip,  
convert(varchar,tcPresupuestoComisreclam.FechaCobro,103) as dregl,
'' as soldé, 
tgMarca.Descrip,    
tgModelo.Descrip,   
tcVeh.Chasis, 
tcVeh.NumPedidoFab,   
LTRIM(RTRIM(tgcliente.Nombre)) +' '+ LTRIM(RTRIM(tgcliente.Apellido1)) as ClientFacture,
tcPresupuestoComisreclam.Importe,
'' as montant,   
Replace(LTRIM(RTRIM(REPLACE(REPLACE(tcPresupuestoComisreclam.Obser, CHAR(13), ' '), CHAR(10), ' ') )), ',', '.')   as Obser,
tgPtoVenta.descrip,
YEAR(tcPresupuestoComisreclam.Fecha) as DateCommision
FROM 
tcPresupuestoComisreclam

LEFT OUTER JOIN tcPresupuesto 	ON 	tcPresupuestoComisreclam.Emp 			= tcPresupuesto.Emp AND  tcPresupuestoComisreclam.NumInterno = tcPresupuesto.NumInterno
INNER JOIN tgcliente ON   tcPresupuesto.ClienteFac = tgcliente.codigo 
LEFT OUTER JOIN tgProveedor 		ON 	tcPresupuestoComisreclam.Proveedor  = tgProveedor.Codigo,  
tcVeh 		  					
LEFT OUTER JOIN tgPtoVenta 		ON 	tcVeh.Emp 				= tgPtoVenta.Emp 	AND 	tcVeh.PuntoVenta 		= tgPtoVenta.PuntoVenta
LEFT OUTER JOIN tcColor 			ON 	tcVeh.Marca 			= tcColor.Marca AND 	tcVeh.Color 			= tcColor.Color 
LEFT OUTER JOIN tcTapiz 			ON 	tcVeh.Marca 			= tcTapiz.Marca AND 	tcVeh.Tapiz 			= tcTapiz.Tapiz 
LEFT OUTER JOIN tgCategoria 		ON 	tcVeh.Categoria 		= tgCategoria.Categoria,
tcComisReclam,   
tgMarca,   
tgModelo,   
tgVersion

WHERE 
( tcPresupuestoComisreclam.Emp 				= tcComisReclam.Emp 			) and  
( tcPresupuestoComisreclam.Comision 		= tcComisReclam.Comision 	) and  
( tcPresupuestoComisreclam.Emp 			 	= tcVeh.Emp 					) and  
( tcPresupuestoComisreclam.NumInternoVeh	= tcVeh.NumInterno 			) and  
( tcVeh.Marca 										= tgMarca.Marca 				) and  
( tcVeh.Modelo 									= tgModelo.Modelo 			) and  
( tcVeh.Marca 										= tgModelo.Marca 				) and  
( tcVeh.Marca 										= tgVersion.Marca 			) and  
( tcVeh.Modelo 									= tgVersion.Modelo 			) and  
( tcVeh.Version 									= tgVersion.Version 			) and    
(tcPresupuestoComisreclam.Emp 				= '002' 						) AND  
(tcVeh.EsVO 										= 0 ) AND
(FechaFactura <> ' ') AND 
(Importe <> .00) AND
(tcPresupuestoComisreclam.Fecha BETWEEN '01-01-2007' AND '31-07-2011') AND

(CobroFinalizado = '0' ) AND (CobroFinalizado = '1' AND  tcPresupuestoComisreclam.FechaCobro >'31-07-2011')

C'est la dernière ligne en question


(CobroFinalizado = '0' ) AND (CobroFinalizado = '1' AND tcPresupuestoComisreclam.FechaCobro >'31-07-2011')

Le reste des conditions sont identiques, mais il n'y a que la ligne ci dessus qui change.

Je voudrait avoir:

L'ensemble des commission non soldée (CobroFinalizado = '0').
ET
l'ensemble des commission Soldée (CobroFinalizado = '1') mais qui ont une date de paiement supérieur à la XX date (tcPresupuestoComisreclam.FechaCobro >'31-07-2011')

Re: Aide sur une requete SQL

Posté : 30 août 2011, 18:19
par Cyrano
Ben tu y étais presque.

Observe bien, les lignes qui doivent être retournées sont donc celles dont le solde vaut 0 ET celles dont le solde vaut 1 si la date de paiement est supérieure au 31/07/2011. Donc il faut que ça corresponde « obligatoirement à une des deux conditions » : donc on va mettre ces conditions dans un AND mais séparer les deux possibilités avec un OR et utiliser des parenthèses pour regrouper correctement les deux possibilités.

En résumé, ta requête doit donc être :
SELECT
  CONVERT(VARCHAR,tcPresupuesto.FechaFactura,103)           AS 'datefacture',
  CONVERT(     VARCHAR,tcPresupuestoComisreclam.Fecha,103)  AS 'DATE',
  tcComisReclam.Descrip                                     AS 'ComisDescrip',
  CONVERT(VARCHAR,tcPresupuestoComisreclam.FechaCobro,103)  AS 'dregl',
  ''                                                        AS 'soldé',
  tgMarca.Descrip                                           AS 'MarcaDescrip',
  tgModelo.Descrip                                          AS 'ModeloDescrip',
  tcVeh.Chasis                                              AS 'Chasis',
  tcVeh.NumPedidoFab                                        AS 'NumPedidoFab',
  LTRIM(RTRIM(tgcliente.Nombre)) +
  ' '+
  LTRIM(RTRIM(tgcliente.Apellido1))                         AS ClientFacture,
  tcPresupuestoComisreclam.Importe                          AS Importe,
  ''                                                        AS montant,
  REPLACE(
    LTRIM(
      RTRIM(
        REPLACE(
          REPLACE(
            tcPresupuestoComisreclam.Obser,
            CHAR(13),
            ' '
          ),
          CHAR(10),
          ' '
        )
      )
    ),
    ',',
    '.'
  )                                                         AS Obser,
  tgPtoVenta.descrip,
  YEAR(tcPresupuestoComisreclam.Fecha)                      AS DateCommision
FROM tcPresupuestoComisreclam
  LEFT OUTER JOIN tcPresupuesto ON tcPresupuestoComisreclam.Emp       = tcPresupuesto.Emp
                                                                    AND tcPresupuestoComisreclam.NumInterno = tcPresupuesto.NumInterno
  INNER JOIN tgcliente          ON tcPresupuesto.ClienteFac           = tgcliente.codigo
  LEFT OUTER JOIN tgProveedor   ON tcPresupuestoComisreclam.Proveedor = tgProveedor.Codigo, tcVeh
  LEFT OUTER JOIN tgPtoVenta    ON tcVeh.Emp                          = tgPtoVenta.Emp
                                                                    AND tcVeh.PuntoVenta = tgPtoVenta.PuntoVenta
  LEFT OUTER JOIN tcColor       ON tcVeh.Marca                        = tcColor.Marca
                                                                    AND tcVeh.Color = tcColor.Color
  LEFT OUTER JOIN tcTapiz       ON tcVeh.Marca                        = tcTapiz.Marca
                                                                    AND tcVeh.Tapiz = tcTapiz.Tapiz
  LEFT OUTER JOIN tgCategoria   ON tcVeh.Categoria                    = tgCategoria.Categoria, tcComisReclam, tgMarca, tgModelo, tgVersion
WHERE tcPresupuestoComisreclam.Emp            = tcComisReclam.Emp
  AND tcPresupuestoComisreclam.Comision       = tcComisReclam.Comision
  AND tcPresupuestoComisreclam.Emp            = tcVeh.Emp
  AND tcPresupuestoComisreclam.NumInternoVeh  = tcVeh.NumInterno
  AND tcVeh.Marca                             = tgMarca.Marca
  AND tcVeh.Modelo                            = tgModelo.Modelo
  AND tcVeh.Marca                             = tgModelo.Marca
  AND tcVeh.Marca                             = tgVersion.Marca
  AND tcVeh.Modelo                            = tgVersion.Modelo
  AND tcVeh.Version                           = tgVersion.Version
  AND tcPresupuestoComisreclam.Emp            = '002'
  AND tcVeh.EsVO                              = 0
  AND FechaFactura                           <> ' '
  AND Importe                                <> .00
  AND tcPresupuestoComisreclam.Fecha          BETWEEN '01-01-2007' AND '31-07-2011'
  AND (
      CobroFinalizado                         = '0'
     OR(
          CobroFinalizado                     = '1'
      AND tcPresupuestoComisreclam.FechaCobro >'31-07-2011'
    )
  );
Normalement, ça doit fonctionner.

Un petit truc cependant : pour faciliter la lecture de tes requêtes, je te recommande vivement « d'aliaser » tes tables et surtout de mettre entre guillemets les alias de colonnes lorsque tu utilises un mot réservé comme Date par exemple, et en fait pour simplifier de mettre systématiquement des guillemets, ça simplifiera, ça va couper pas mal et permettre de faire des alignements qui rendent la lecture et la compréhension autrement plus appréciable. Ça donnerait ceci :
SELECT
  CONVERT(VARCHAR,pp.FechaFactura,103)  AS 'datefacture',
  CONVERT(VARCHAR,pc.Fecha,103)         AS 'DATE',
  cr.Descrip                            AS 'ComisDescrip',
  CONVERT(VARCHAR,pc.FechaCobro,103)    AS 'dregl',
  ''                                    AS 'soldé',
  mc.Descrip                            AS 'MarcaDescrip',
  md.Descrip                            AS 'ModeloDescrip',
  vh.Chasis                             AS 'Chasis',
  vh.NumPedidoFab                       AS 'NumPedidoFab',
  LTRIM(RTRIM(cl.Nombre)) +
  ' '+
  LTRIM(RTRIM(cl.Apellido1))            AS 'ClientFacture',
  pc.Importe                            AS 'Importe',
  ''                                    AS 'montant',
  REPLACE(
    LTRIM(
      RTRIM(
        REPLACE(
          REPLACE(
            pc.Obser,
            CHAR(13),
            ' '
          ),
          CHAR(10),
          ' '
        )
      )
    ),
    ',',
    '.'
  )                                     AS 'Obser',
  pv.descrip                            AS 'descrip',
  YEAR(pc.Fecha)                        AS 'DateCommision'
FROM tcPresupuestoComisreclam   AS pc
  LEFT OUTER JOIN tcPresupuesto AS pp ON pc.Emp         = pp.Emp
                                     AND pc.NumInterno  = pp.NumInterno
  INNER JOIN tgcliente          AS cl ON pp.ClienteFac  = cl.codigo
  LEFT OUTER JOIN tgProveedor   AS pr ON pc.Proveedor   = pr.Codigo,
  tcVeh                         AS vh
  LEFT OUTER JOIN tgPtoVenta    AS pv ON vh.Emp         = pv.Emp
                                     AND vh.PuntoVenta  = pv.PuntoVenta
  LEFT OUTER JOIN tcColor       AS co ON vh.Marca       = co.Marca
                                     AND vh.Color       = co.Color
  LEFT OUTER JOIN tcTapiz       AS tz ON vh.Marca       = tz.Marca
                                     AND vh.Tapiz       = tz.Tapiz
  LEFT OUTER JOIN tgCategoria   AS ct ON vh.Categoria   = ct.Categoria,
  tcComisReclam                 AS cr,
  tgMarca                       AS mc,
  tgModelo                      AS md,
  tgVersion                     AS vn
WHERE pc.Emp            = cr.Emp
  AND pc.Comision       = cr.Comision
  AND pc.Emp            = vh.Emp
  AND pc.NumInternoVeh  = vh.NumInterno
  AND vh.Marca          = mc.Marca
  AND vh.Modelo         = md.Modelo
  AND vh.Marca          = md.Marca
  AND vh.Marca          = vn.Marca
  AND vh.Modelo         = vn.Modelo
  AND vh.Version        = vn.Version
  AND pc.Emp            = '002'
  AND vh.EsVO           = 0
  AND FechaFactura     <> ' '
  AND Importe          <> .00
  AND pc.Fecha          BETWEEN '01-01-2007' AND '31-07-2011'
  AND (
      CobroFinalizado     = '0'
     OR(
          CobroFinalizado = '1'
      AND pc.FechaCobro   > '31-07-2011'
    )
  );
Mieux non ?