2016-05-11 5 views
2

私は、このようSUM() OVER(PARTITION BY)を使用していた私の非常に基本的なSQLクエリのスキルを改善しようとしているとSQL Server 2012でAdventureWorks2012サンプルデータベースを使用しています:各顧客の総売上高の値を取得するにはT-SQLの複数の基準をどのように合計しますか?

SELECT DISTINCT 
    SUM(SubTotal) OVER (PARTITION BY CustomerID), CustomerID 
FROM 
    Sales.SalesOrderHeader 

しかし、私は顧客&年でSubTotalを合計して、YEAR(OrderDate)を使用して注文日のちょうど年の部分を抽出したいと思います。

最初に、注文日の年の部分を顧客とは別に年ごとに使用することはできないため、このアプローチはどうにかなるわけではありません。

第2に、複数のパーティション基準を使用する方法がありません。

私の未熟さが私にこれを間違った方法で考えさせていると思うので、理論的なアプローチは特定の解決策ほど役に立つと思います。

私はExcelのSUMIFS()機能

答えて

3

ファーストと機能的に似ている何かを探していると思い、あなたのクエリを記述するための正しい方法は次のとおりです。ウィンドウ関数と

SELECT DISTINCTを使用して
SELECT CustomerID, SUM(SubTotal) 
FROM Sales.SalesOrderHeader 
GROUP BY CustomerID; 

は賢いです。しかし、クエリが過度に複雑になり、パフォーマンスが低下し、読んでいる人に混乱を招くことになります。

(顧客ごと)年によって情報を取得するには、ちょうどSELECTGROUP BYにそれを追加します。

SELECT CustomerID, YEAR(OrderDate) as yyyy, SUM(SubTotal) 
FROM Sales.SalesOrderHeader 
GROUP BY CustomerID, YEAR(OrderDate) 
ORDER BY CustomerId, yyyy; 

あなたが実際に小計で別の行を取得したい場合は、GROUPING SETSROLLUPにアップ勉強。これらはGROUP BYのオプションです。

+0

あなたゴードンありがとうとGROUP BY句に非常に高く評価dateを追加 - 私は歩くことができる前に実行しようとしていると思います!私は標準的なGROUP BYの拡張を認識しておらず、あなたのコードは私が望むことをしているように見えますが、もっと深く見ていきます。 – fraggle

1

あなたは

select customerId, sum(subTotal) 
FROM sales.salesOrderHeader 
group by customerId 

編集以下の通り(得意先)のような特定の列に対して集計(sum/count/max)を必要とする時はいつでもあなたがgroup by代わりのPARTITION BYを使用する必要があります。日付の不足している要件を含むが(応答がコメントに)

複数の列に対して計算を行いたい場合でも、同じ方法で行うことができます。ただ、group by customerId, saleDate

select customerId, sum(subTotal) 
,saleDate //=> you can miss it (date) from selection if you want to 
FROM sales.salesOrderHeader 
group by customerId, saleDate 
+0

迅速な対応のおかげでありがとうサミですが、顧客ID。私はGROUP BYについてのあなたの意見を得て、私の(限られた!)理解を改善するためにそれをさらに探求します – fraggle

関連する問題