2016-05-25 19 views
1

平均商品/店舗数を検索しようとしています。そこに合計100社の製品は、カウントを使用することによって、私は店1に対して9つの製品を得た場合は商品コード、PNAME、StoreId件数の平均を計算

Store  Avg.Products 
Store 1  100 
Store 2  20 

ストアテーブル:

ProductsテーブルをStoreId私はこのような何かをしたいです私は、私が試した店1と同様に他の店のための9/100

たい:

Select avg(counts) from(Select count(*) AS counts 
    FROM Store Join Product ON Store.Id = product.StoreId Group By Store.id)table1 

しかしこれはちょうど私に単一の値を与えます。何か案は?おかげ

答えて

0

あなたは店舗名によってグループに外部クエリを試してみて、それが非整数値を返すことができるようにfloatAVGパラメータをキャストすることができます

SELECT storeName, avg(CAST(counts AS float)) FROM 
    (Select count(*) AS counts, S.Name as storeName 
     FROM Store S JOIN Product P ON S.Id = P.StoreId Group By S.id, S.Name) table1 
    GROUP BY storeName 

それは最善の方法ではないかもしれこれを行うには、期待される結果を返す必要があります。

UPDATE

私は答えを検証し、固定されたバージョンで、コードを更新しました。それがあなたの事件のために働くかどうか私に教えてください。

UPDATE II

コメントによると、あなたは、各ショップ名用製品の数を計算し、データベース内の製品の合計数で割りたいと思います。 これは1つのクエリであることを持っている場合、あなたはこのようにそれを行うことができます。

SELECT S.Name as storeName, CAST(count(*) AS float)/MIN(T.TotalCount) AS AVGToTotalProductsCount 
    FROM Store S JOIN Product P ON S.Id = P.StoreId 
     JOIN (SELECT COUNT(1) AS TotalCount FROM Product) T ON 1=1 
    GROUP BY S.Name 

クエリが複数のクエリに分割することができますしかし、もし、あなたがこのようにそれを計算することができる場合があります

DECLARE @totalNumOfProducts INT 
SELECT @totalNumOfProducts = COUNT(1) FROM Product 

SELECT S.Name as storeName, CAST(COUNT(*) AS float)/@totalNumOfProducts AS AVGToTotalProductsCount 
    FROM Store S JOIN Product P ON S.Id = P.StoreId 
    GROUP BY S.Name 
+0

私は少し混乱しています。このクエリは、商品の数が返す値と同じ値を返すのはなぜですか? – TechGirl

+0

場合によってはそれが必要です。特定の名前を持つ1つのショップ(1つのshop.Id)しかない場合、このショップ名の平均値はその商品の数と同じなので、両方の照会が同じ値を返すことがあります。それ以外の場合は、異なる場合があります。 –

+0

私は各グループの平均がnumberOfProductsInThatGroup /総製品数として計算されていることを理解していますか? – TechGirl

0

あなたは正しい道を歩いています。派生テーブルでCOUNT(ProductID)GROUP BY StoreIDを取得します。その後JOINバックStoreIDであなたのメインクエリに、そしてAVG集約行うこと:

SELECT S.Name, AVG(ProductCount) 
FROM Stores S 
INNER JOIN (SELECT COUNT(ProductID) as ProductCount, StoreID 
      FROM Stores S 
      GROUP BY StoreID) P on S.ID = P.StoreID 
GROUP BY S.Name 
0

をあなたはあまりにもハード、それを作っています。結合から生じる製品を数えてください。

select s.StoreID, s.Name, count(p.ProductID) ProductCount 
from store s 
    join Product p on p.StoreID=s.StoreID 
group by s.StoreID, s.Name 
order by count(p.ProductID);