2016-12-19 6 views
1

これは素晴らしい動作します。しかし、私はまた、その日付範囲で販売されていないアイテムを含めることを望みます。現在、選択した期間内に販売されたアイテムのみを表示しています。私もそれを販売していない項目を表示したいと思います。コメントに基づいてWHERE条件に一致しないレコードを含める

SELECT i.item_number, i.item_name, ish.avg_cost, ish.avg_retail, ish.avg_daily_sales, 
CASE WHEN i.sold_by_id = '0' THEN 'pcs' 
    WHEN i.sold_by_id = '1' THEN 'lbs' 
    WHEN i.sold_by_id = '2' THEN 'lbs' 
END [Sold_by] 
FROM inventory i 
INNER JOIN 
    (SELECT ish.item_number, AVG(avg_cost) as avg_cost, AVG(avg_retail) as avg_retail, ROUND(AVG(total_sold),0) as avg_daily_sales 
    FROM inventory_sales_history ish 
     LEFT JOIN Inventory i ON i.item_number = ish.Item_Number 
WHERE ish.the_date BETWEEN '12-11-2016' AND '12-18-2016' 
AND ish.item_number IN (SELECT item_number FROM inventory i JOIN department d ON d.department_id = i.department_id WHERE d.category_id = '4') 
GROUP BY ish.item_number)ish 
ON i.item_number = ish.item_number 
ORDER BY i.item_name 

更新:

inventoryテーブルにだが、ないinventory_sales_historyテーブル

+0

どのように販売されていない商品を特定しますか? – JanR

+0

インベントリテーブルには含まれていますが、inventory_sales_historyテーブルにない場合 – user3556177

答えて

1
SELECT i.item_number, i.item_name, ish.avg_cost, ish.avg_retail, ish.avg_daily_sales, 
CASE WHEN i.sold_by_id = '0' THEN 'pcs' 
    WHEN i.sold_by_id = '1' THEN 'lbs' 
    WHEN i.sold_by_id = '2' THEN 'lbs' 
END [Sold_by] 
FROM inventory i 
LEFT JOIN 
    (SELECT ish.item_number, AVG(avg_cost) as avg_cost, AVG(avg_retail) as avg_retail, ROUND(AVG(total_sold),0) as avg_daily_sales 
    FROM inventory_sales_history ish 
     LEFT JOIN Inventory i ON i.item_number = ish.Item_Number 
WHERE ish.the_date BETWEEN '12-11-2016' AND '12-18-2016' 
AND ish.item_number IN (SELECT item_number FROM inventory i JOIN department d ON d.department_id = i.department_id WHERE d.category_id = '4') 
GROUP BY ish.item_number)ish 
ON i.item_number = ish.item_number 
ORDER BY i.item_name 
+0

これは機能しませんでした。すべての在庫を引き上げ、category_idを無視しました – user3556177

2

にこれが同じであるとして特定されて販売しているアイテムDVTの答えとして、サブクラスへの結合を内部結合から左結合に変更するという点では、私はちょうどそれを見て少し質問をリファクタリングしました。

Bad habits to kick : mis-handling date/range queries - Aaron Bertrandを調べるとよいでしょう。

編集:部門は、外部クエリ

select 
    i.item_number 
    , i.item_name 
    , ish.avg_cost 
    , ish.avg_retail 
    , ish.avg_daily_sales 
    , Sold_by = case 
      when i.sold_by_id = '0' then 'pcs' 
      when i.sold_by_id = '1' then 'lbs' 
      when i.sold_by_id = '2' then 'lbs' 
      end 
    from inventory i 
    inner join department d on d.department_id = i.department_id 
     and d.category_id='4' 
    left join (
    select 
      ish.item_number 
      , avg_cost = avg(avg_cost) 
      , avg_retail = avg(avg_retail) 
      , avg_daily_sales = round(avg(total_sold), 0) 
     from inventory_sales_history ish 
     where ish.the_date between '12-11-2016' and '12-18-2016' 
     group by ish.item_number 
    ) as ish on i.item_number = ish.item_number 
    order by i.item_name 
+0

他のソリューションと同じです。すべてのアイテムを表示します。 category_idを無視します。 – user3556177

+0

@ user3556177それを修正しました – SqlZim

+0

@ user3556177 - 間違いなく上記のリンクを見てください。適切な日付処理に関するヒントは、このフィルタだけでなく、日付フィルタを使用するほとんどすべてのクエリに適用できます。 – Leigh

1

に参加する移動はそれを手に入れました。あなたの提案は正しい方向に私を指摘しました。

SELECT i.item_number 
     , i.item_name 
     , ish.avg_cost 
     , ish.avg_retail 
     , ish.avg_daily_sales 
     , CASE WHEN i.sold_by_id = '0' THEN 'pcs' 
      WHEN i.sold_by_id = '1' THEN 'lbs' 
      WHEN i.sold_by_id = '2' THEN 'lbs' 
     END [Sold_by] 
FROM inventory i LEFT JOIN 
     (
      SELECT ish.item_number 
        , AVG(avg_cost) as avg_cost 
        , AVG(avg_retail) as avg_retail 
        , ROUND(AVG(total_sold),0) as avg_daily_sales 
      FROM inventory_sales_history ish LEFT JOIN Inventory i 
        ON i.item_number = ish.Item_Number 
      WHERE ish.the_date BETWEEN '12-11-2016' AND '12-18-2016' 
      GROUP BY ish.item_number 
     ) 
     ish ON i.item_number = ish.item_number 
WHERE i.item_number IN 
     (
      SELECT item_number 
      FROM inventory i JOIN department d 
       ON d.department_id = i.department_id 
      WHERE d.category_id = '4' 
     ) 
ORDER BY i.item_name 
関連する問題