2009-12-08 4 views
0

Pour une raison quelconque, je ne parviens pas à restreindre mes résultats à des produits dont le statut de prix est "normal." Lorsque j'utilise une clause where comme where pricestatus like 'normal', le jeu de résultats filtre également les autres enregistrements. toutes les idées ici?Impossible de filtrer les résultats définis dans la requête SQL Server

SELECT 
    od.order_id, 
    ISNULL(p.pricestatus,'normal') as pricestatus, 
    ISNULL(od.partnumber,'unknown') as partnumber, 
    od.product_id, 
    od.producttitle, 
    qty, 
    od.price, 
    extprice, 
    customfield1 AS prodstatus, 
    ISNULL(categorytitle,'-') AS categorytitle, 
    needbydate, 
    customfield2 AS vendor, 
    (SELECT opttitle 
     FROM options o 
    WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
      AND optlevel = 1) AS color, 
    (SELECT opttitle 
     FROM options o 
    WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
      AND optlevel = 2) AS size, 
    od.producttitle + ISNULL((SELECT opttitle 
           FROM options o 
           WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
           AND optlevel = 1),'') + ISNULL((SELECT opttitle 
                    FROM options o 
                   WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
                    AND optlevel = 2),'') + Cast(od.price AS VARCHAR(15)) AS pkey 

FROM  
    orderdetails od 
    INNER JOIN orders ord ON ord.order_id = od.order_id 
    LEFT OUTER JOIN products p ON p.product_id = od.product_id 
    LEFT OUTER JOIN objectgroups ob ON p.objectgroup_id = ob.objectgroup_id 
    LEFT OUTER JOIN categories c ON ob.category_id = c.category_id 
WHERE 
    1=1 
    AND ord.shippingdate BETWEEN {ts '2009-10-05 00:01:00'} AND {ts '2009-10-21 23:59:59'} 
    AND ISNULL(ord.status,0) IN (5,12) 
    AND ISNULL(ord.status,0) <> 6 
    AND ISNULL(ord.status,0) <> 10 
    AND ISNULL(ord.status,0) <> 7 
    AND ISNULL(ord.status,0) <> 8 
ORDER BY 
    pkey 

Répondre

3

Vous faites une JOIN EXTERNE GAUCHE sur les produits. Rappelez-vous que si vous mettez une condition dans la clause WHERE, elle va appliquer cette condition à l'ensemble WHOLE, ainsi toute ligne qui ne ramènera pas un produit sera automatiquement filtrée car votre condition ne peut pas être vraie.

Vous devrez ajouter la condition à votre place rejoindre:

LEFT OUTER JOIN products p 
    ON p.product_id = od.product_id AND p.priceStatus LIKE "%normal%' 
+0

Vous l'homme Justin. Vous avez résolu mon problème. – jeff

+0

De rien, Jeff :) –

1

Qu'est-ce que les données d'ressemble? a moins que les données sont exactement le texte normal, vous ne serez pas ramasser les variations de la normale.

Effectuez les opérations suivantes au lieu

WHERE priceStatus LIKE "%normal%' 

si vous voulez des enregistrements NULL ainsi, utilisez

WHERE PriceStatus LIKE '%normal%' or PriceStatus is NULL 
0

Je pense que vous devez ajouter à la fin de votre clause where

and isnull(p.pricestatus,'normal') = 'normal' 

comme celui-ci

SELECT od.order_id, 
Isnull(p.pricestatus,'normal') as pricestatus, 
     Isnull(od.partnumber,'unknown') as partnumber, 

    od.product_id, 
    od.producttitle, 
    qty, 
    od.price, 
    extprice, 
    customfield1                             AS prodstatus, 
    Isnull(categorytitle,'-')                          AS categorytitle, 
    needbydate, 
    customfield2                             AS vendor, 
    (SELECT opttitle 
     FROM options o 
     WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
      AND optlevel = 1) AS color, 
    (SELECT opttitle 
     FROM options o 
     WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
      AND optlevel = 2) AS size, 
    od.producttitle + Isnull((SELECT opttitle 
           FROM options o 
           WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
             AND optlevel = 1),'') + Isnull((SELECT opttitle 
                     FROM options o 
                     WHERE Charindex(',' + Cast(o.opt_id AS VARCHAR) + ',',',' + opt_ids + ',') > 0 
                      AND optlevel = 2),'') + Cast(od.price AS VARCHAR(15)) AS pkey 


FROM  orderdetails od 
    INNER JOIN orders ord 
     ON ord.order_id = od.order_id 
    LEFT OUTER JOIN products p 
     ON p.product_id = od.product_id 



    LEFT OUTER JOIN objectgroups ob 
     ON p.objectgroup_id = ob.objectgroup_id 
    LEFT OUTER JOIN categories c 
     ON ob.category_id = c.category_id 
WHERE 1=1 



    and isnull(p.pricestatus,'normal') = 'normal' 
    AND ord.shippingdate BETWEEN {ts '2009-10-05 00:01:00'} AND {ts '2009-10-21 23:59:59'} 
    AND Isnull(ord.status,0) IN (5,12) 
    AND Isnull(ord.status,0) <> 6 
    AND Isnull(ord.status,0) <> 10 
    AND Isnull(ord.status,0) <> 7 
    AND Isnull(ord.status,0) <> 8 


ORDER BY pkey 
Questions connexes