2016-05-26 6 views
-1

サブクエリを初めて使用しました。相関関係は現在、問題を理解しようとしています。可能な相関サブクエリ

私は、クエリを持っている:

SELECT Sales.SalesOrderHeader.CustomerID, SUM(Sales.SalesOrderDetail.LineTotal) 
FROM Sales.SalesOrderDetail 
    INNER JOIN Sales.SalesOrderHeader 
    ON Sales.SalesOrderDetail.SalesOrderID = Sales.SalesOrderHeader.SalesOrderID 
GROUP BY Sales.SalesOrderHeader.CustomerID; 

私はサブクエリの相関関係を使用してクエリを書き換えしようとしています:

SELECT Sales.SalesOrderHeader.CustomerID, 
     (SELECT SUM(Sales.SalesOrderDetail.LineTotal) 
     FROM Sales.SalesOrderDetail 
     GROUP BY SalesOrderDetail.SalesOrderID) 
FROM Sales.SalesOrderHeader 
GROUP BY Sales.SalesOrderHeader.CustomerID; 

私は次のエラーを持っていると私は私が必要なものを理解していません修正:

サブクエリが1つ以上の値を返しました。 サブクエリが、=、!<、< =、>、> =、またはサブクエリが式 として使用されている場合は、これは許可されません。

また、元のクエリと異なるオプションの関連付けを提案するとよいでしょう。良い一日を過ごしてください。

答えて

0

サブクエリ内でグループをスキップし、代わりに相関を追加します。

SELECT Sales.SalesOrderHeader.CustomerID, 
     (SELECT SUM(Sales.SalesOrderDetail.LineTotal) 
     FROM Sales.SalesOrderDetail 
     WHERE Sales.SalesOrderDetail.SalesOrderID = Sales.SalesOrderHeader.SalesOrderID) 
FROM Sales.SalesOrderHeader 

同じ、使用して、テーブルの別名:

SELECT soh.CustomerID, 
     (SELECT SUM(sod.LineTotal) 
     FROM Sales.SalesOrderDetail sod 
     WHERE sod.SalesOrderID = soh.SalesOrderID) 
FROM Sales.SalesOrderHeader soh 

編集:

SELECT DISTINCT soh.CustomerID, 
     (SELECT SUM(sod.LineTotal) 
     FROM Sales.SalesOrderDetail sod 
     WHERE sod.SalesOrderID = soh.SalesOrderID) 
FROM Sales.SalesOrderHeader soh 

ますかSELECT DISTINCT重複行を削除し、同じrを返すGROUP BYバージョンとしてください。

+0

それは、代わりに31465行19119になった。 –

+0

興味があれば、ここでデータベースをダウンロードできます。 https://msftdbprodsamples.codeplex.com/downloads/get/880661 –

+0

31349行が受信されました。 –

0

サブクエリは、各行に対して1つの値しか返さないようにしてください。あなたのコード:あなたはSalesOrderDetail.SalesOrderIDによってグループ化されているので、

(SELECT SUM(Sales.SalesOrderDetail.LineTotal) 
     FROM Sales.SalesOrderDetail 
     GROUP BY SalesOrderDetail.SalesOrderID) 

はもっとして一つの値を返し、SalesOrderDetail.SalesOrderID異なるがテーブルにあるようResultSetが同じ数の行を持つことになります。

したがって、group by句を削除する必要があり、それが機能します。その結果、設定するSalesOrderDetail.SalesOrderIDでろ過され、行ごとに値が得られます

(SELECT SUM(SalesOrderDetail.LineTotal) 
     FROM SalesOrderDetail 
     WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID) 

:あなたはSalesOrderDetail.SalesOrderIDごとにそれぞれの値を持つようにしたい場合はそうでない場合、あなたはjarlhの答えのようにwhere句を使用する必要があります。

ご理解ください。

+0

状況を明確にしていただきありがとうございます。どのように異なる数の行が受け取られたのかを推測します。 –

+0

どのステートメントが異なる行数を与えていますか? –

+0

** jarlh **回答 - 31465行元のクエリ - 19119 –

関連する問題