2017-11-18 5 views
-1

次のコードは7行あります。同じ商品名の列の平均、最小、最大を取ってみたい(たとえば、「Shoes」という名前の製品が3つあり、そのコストは50,45,60です。私は1つの製品を持っています今度は50,45,60という3つの共通の行を平均して51.66を表示する必要があります。他の行は50などを表示する必要があります)SQL Serverで特定の行の集計が必要な場合に集計関数を使用する方法2014

私の問題は、同じ行の平均、最小、最大をとるのではなく、同じ行の平均、最大、最小を表示するクエリを実行する場合です。

SELECT 
    PRODUCT.ProductName, 
    Vendor.VendorName, VendorProduct.Cost, 
    AVG(COST) AS AVG, 
    MIN(COST) AS MIN, 
    MAX(COST) AS MAX 
FROM 
    PRODUCT 
JOIN 
    VendorProduct ON VendorProduct.ProductID = PRODUCT.ProductID 
JOIN 
    Vendor ON Vendor.VendorID = VendorProduct.VendorID 
GROUP BY 
    PRODUCT.ProductName, VendorProduct.Cost, Vendor.VendorName 

助けてください。

+1

あなたの質問は、適切なデータサンプルと期待される結果 – scaisEdge

+2

編集あなたの質問を追加して、サンプルデータを提供更新し、希望のネーミングコラム再ゴードンのアドバイスをそそっている場合MSDNはそれらについて言いたいことがたくさんあります結果。 –

+1

あなたの質問がMySQLかsqlserverについてのものかどうか判断してください。答えはかなり異なります –

答えて

1

私は、あなたがしたいことを推測しています:

SELECT p.ProductName, 
     AVG(vp.COST) AS AVG, MIN(vp.COST) AS MIN, MAX(vp.COST) AS MAX 
FROM PRODUCT p join 
    VendorProduct vp 
    on vp.ProductID = p.ProductID 
GROUP BY p.ProductName; 

注:

  • 私はテーブルのための略語を使用して、すべての列名を修飾しています。
  • SELECTからベンダ名を削除しました。製品ごとの平均が必要なためです。
  • 同じ理由でGROUP BYからベンダー名と価格を削除しました。
  • AVG,MINおよびMAXは、SQLキーワードであるため、列の悪い名前です。
1

変更

AVG(cost) as avg 

AVG(cost) OVER(PARTITION BY productname) as [avg] 

へ 他の集合体に同じ変更(OVER句を追加する)を作成し、また、ラインによって完全に

これをGROUPを削除現在取得している行数と同じ数の行が表示されますが、集計は同じ値のすべてに対して繰り返します商品名。ベンダーの詳細を保つこともできます

この意味は? sqlsではウィンドウ関数と呼ばれます。データセットをグループ化し、詳細な行の詳細を失うことなく、グループ化された結果を詳細行に暗黙的に接続する方法です。あなたの好奇心が

注意、

関連する問題