私は T-SQL を独学しており、次の例を理解するのに苦労しています..
結果セット全体またはより大きなグループ化レベルに適用されるいくつかの集計式とともに、いくつかの非集計列を表示するとします。たとえば、Sales.SalesOrderHeader テーブルからいくつかの列を表示し、すべての顧客の売上の TotalDue と比較した各売上の TotalDue の割合を計算する必要がある場合があります。CustomerID でグループ化する場合、それらの列でグループ化しない限り、Sales.SalesOrderHeader からの他の非集計列を含めることはできません。これを回避するには、派生テーブルまたは CTE を使用できます。
ここに与えられた2つの例があります...
SELECT c.CustomerID, SalesOrderID, TotalDue, AvgOfTotalDue,
TotalDue/SumOfTotalDue * 100 AS SalePercent
FROM Sales.SalesOrderHeader AS soh
INNER JOIN
(SELECT CustomerID, SUM(TotalDue) AS SumOfTotalDue,
AVG(TotalDue) AS AvgOfTotalDue
FROM Sales.SalesOrderHeader
GROUP BY CustomerID) AS c ON soh.CustomerID = c.CustomerID
ORDER BY c.CustomerID;
WITH c AS
(SELECT CustomerID, SUM(TotalDue) AS SumOfTotalDue,
AVG(TotalDue) AS AvgOfTotalDue
FROM Sales.SalesOrderHeader
GROUP BY CustomerID)
SELECT c.CustomerID, SalesOrderID, TotalDue,AvgOfTotalDue,
TotalDue/SumOfTotalDue * 100 AS SalePercent
FROM Sales.SalesOrderHeader AS soh
INNER JOIN c ON soh.CustomerID = c.CustomerID
ORDER BY c.CustomerID;
このクエリで同じ結果が得られないのはなぜですか..
SELECT CustomerID, SalesOrderID, TotalDue, AVG(TotalDue) AS AvgOfTotalDue,
TotalDue/SUM(TotalDue) * 100 AS SalePercent
FROM Sales.SalesOrderHeader
GROUP BY CustomerID, SalesOrderID, TotalDue
ORDER BY CustomerID
上記の例を別の方法で説明したり、論理的にステップスルーして、それらがどのように機能するかを理解できる人を探していますか?