0

私の簡略化されたクエリは次のようになります。

 SELECT p.product_Id,
       p.productName,
       s.LastSales_date
FROM products as p 
            LEFT OUTER JOIN
 (  SELECT product_id , 
           max(Sales_date) as LastSales_date  
          FROM Sales group by product_id) as s
on s.product_id=p.product_Id 
where  
  (s.LastSales_date is null or  -- is it right? 
  s.LastSales_date between '2012/01/01' and '2012/01/05') 

結果:

ProductName       LastSalesDate  
   p_A             2012/01/01
   p_C             2012/01/01
   p_E             2012/01/02

しかし、見逃した行があり、sales_date がない行があるため、次のような結果を取得する方法は次のとおりです。

ProductName       LastSalesDate  
   p_A             2012/01/01
   p_b             <null>
   p_C             2012/01/01
   p_E             2012/01/02

私の問題 (null) の行が表示されません。試していただければ幸いです:-)

4

2 に答える 2

2

外部結合を使用する場合は、結合自体から外部データをフィルタリングすることを忘れないでください。そうしないと、内部結合が有効になります。

SELECT p.product_Id,
       p.productName,
       s.LastSales_date
FROM products as p 
LEFT OUTER JOIN
 (
   SELECT product_id , 
          max(Sales_date) as LastSales_date  
     FROM Sales 
    group by product_id
 ) as s
on s.product_id = p.product_Id 
-- Filter s here
and s.LastSales_date between '2012/01/01' and '2012/01/05'

この場合、HAVINGを使用して、アグリゲート自体をフィルタリングできます。

SELECT p.product_Id,
       p.productName,
       s.LastSales_date
FROM products as p 
LEFT OUTER JOIN
 (
   SELECT product_id , 
          max(Sales_date) as LastSales_date  
     FROM Sales 
    group by product_id
-- Filter max(Sales_date) here
   having max(Sales_date) between '2012/01/01' and '2012/01/05'
 ) as s
on s.product_id = p.product_Id 
于 2012-05-10T16:09:51.467 に答える
1

あなたが言及した結果を期待していますが、それがうまくいかない場合は、COALESCE を使用することをお勧めします。

多分...

SELECT
p.product_Id
, p.productName
, COALESCE(s.LastSales_date,'')
FROM
products p 
LEFT OUTER JOIN
    (SELECT
        product_id
        , MAX(Sales_date) AS LastSales_date  
    FROM
        Sales
    GROUP BY
        product_id
    )  s on s.product_id = p.product_Id 
WHERE  
COALESCE(s.LastSales_date,'')  = ''
OR
COALESCE(s.LastSales_date,'') BETWEEN  '2012/01/01' and '2012/01/05'
于 2012-05-10T15:17:38.977 に答える