2016-03-25 8 views
0

私は3つのテーブルSQL Server 2012でサブクエリを使用してカテゴリごとの数量と重量を取得する方法は?

  1. 項目
  2. ItemCategories
  3. 私が持っている次のクエリを拡張する方法を知りたいItemsToPackingLists

あります

  1. の数量あまりにItemCategory件数(SumItemsOfCategory)
  2. ItemCategory(SumWeightOfItemsOfCategory)あたりのアイテムの重量。

ItemsOfPacklistはすでに仕事をして計算するサブクエリ。どんな助けもありがとうございます。

SELECT  items.ID, 
      items.NameOfItem, 
      items.WeightInGrams, 

      ICategories.NameOfCategory, 

      IToPLs.Quantity, 
      (items.WeightInGrams * IToPLs.Quantity) AS TotalWeightInGrams,   

      (SELECT SUM(IToPLs2.Quantity) 
      FROM ItemsToPackingLists AS IToPLs2 
      WHERE PackingListID = 1 
      ) AS ItemsOfPackingList 

FROM trekking_Items AS items 

LEFT JOIN ItemCategories AS ICategories ON 
items.ItemCategoryID = ICategories.ID 

LEFT OUTER JOIN ItemsToPackingLists AS IToPLs ON 
items.ID = IToPLs.ItemID 

WHERE PackingListID = 1 

ORDER BY ICategories.SortID ASC 
+0

サブクエリはこれを行うにはひどく非効率的な方法のようです。あなたは、あなたのメインクエリの同じベーステーブルに既にヒットしています。さらに悪いことに、サブクエリを相関サブクエリにする必要があります。それが立つにつれて、毎回同じ価値が得られます。いくつかの基本的な集約は、実際にここで必要なすべてです。この記事を読んで、素晴らしい場所を見つけてください。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

答えて

0

詳細行ごとに2つのデータを確認しますか?もしそうなら、ウィンドウ関数を使うことをお勧めします。 MSDN:

SELECT... 
COUNT(items.ID) OVER(PARTITION BY items.ItemCategoryID) AS SumItemsOfCategory, 
SUM(items.WeightInGrams * IToPLs.Quantity) OVER(PARTITION BY items.ItemCategoryID) AS SumWeightOfItemsOfCategory 
FROM... 

編集:OPさんのコメントに応えてhttps://msdn.microsoft.com/en-us/library/ms189461.aspx

あなたはの線に沿って何かを追加することができます。それは私の見解です。私は、カテゴリーごとの計算のためのアイテムの数を考慮に入れて、この例を修正しました。

+0

窓関数を使用していただきありがとうございます。意義深く便利です。しかし、各項目の数による乗算が欠落しているため、正しい結果が得られません。私はそれをどこに置くか把握するのに苦労している。 – Thorsten

関連する問題