3つのテーブルを結合し、テーブルAのSum(Quantity)を計算したいと思います。何かを試したところ、目的の出力が得られました。しかし、それでも集計関数とGroupBy句に基づいて混乱が生じています。
2つ以上のテーブルを結合して合計値を計算するときに、Group By句で言及する必要のある列は何ですか。また、それらの列を指定する必要があるのはなぜですか。
例:これが私のテーブルと目的のクエリです。
TableA: ItemID, JobOrderID, CustomerID, DivisionID, Quantity
TableB: ItemID, ItemName, SpecificationID
TableC: SpecificationID, SpecificationName
TableD: DivisionID, DivisionName
TableE: JobOrderID, JobOrderNo.
TableF: CustomerID, CustomerName
ItemID
、CustomerID
、JobOrderID
、およびDivisionID
に基づいてSum(Quantity)を取得したいと思います。
次のクエリを作成しましたが、正常に機能しています。しかし、Group By句の列を削除すると、目的の結果が得られません。どうして? Group By句はここで何をしますか?集計関数を使用するときにGroupBy句を指定するにはどうすればよいですか?これが私のクエリです。
SELECT
B.ItemName + ' - ' + C.SpecificationName AS 'ItemName',
SUM(A.Quantity) AS 'Quantity',
A.ItemID,
D.DivisionName,
F.CustomerName,
E.JobOrderNo,
A.DivisionID,
A.JobOrderID,
A.CustomerID
FROM
TableA A
INNER JOIN TableB B ON B.ItemID = A.ItemID
INNER JOIN TableC C ON C.SpecificationID = B.SpecificationID
INNER JOIN TableD D ON D.DivisionID = A.DivisionID
LEFT JOIN TableE E ON E.JobOrderID = A.JobOrderID
LEFT JOIN TableF F ON F.CustomerID = A.CustomerID
WHERE
A.ItemID = @ItemID
GROUP BY
A.ItemID,
A.JobOrderID,
A.DivisionID,
A.CustomerID,
D.DivisionName,
F.CustomerName,
E.JobOrderNo,
B.ItemName,
C.SpecificationName
これを例として、GroupBy条項について提案してください。
GROUP BY
は、指定された列の一意の組み合わせに対して集計を行います(sum、minなど)。 GROUP BY
句または集計関数で列名を指定しない場合、SQLエンジンは、その種類の列に対してどの値を返す必要があるかを認識できません。
GROUP BY(Transact-SQL) SQL Server 2008 R2の1つ以上の列または式の値によって、選択した行のセットを要約行のセットにグループ化します。グループごとに1行が返されます。 SELECT句リストの集計関数は、個々の行ではなく、各グループに関する情報を提供します。
SELECT a.City, COUNT(bea.AddressID) AS EmployeeCount
FROM Person.BusinessEntityAddress AS bea
INNER JOIN Person.Address AS a
ON bea.AddressID = a.AddressID
GROUP BY a.City
GROUP BY句には、ISO準拠の構文と非ISO準拠の構文があります。 1つのSELECTステートメントで使用できる構文スタイルは1つだけです。すべての新しい作業には、ISO準拠の構文を使用してください。非ISO準拠の構文は、下位互換性のために提供されています。
ISO準拠構文では、リスト内の非集計式の各テーブルまたはビュー列をGROUP BY
リストに含める必要があります。
select pub_id, type, avg(price), sum(total_sales)
from titles
group by pub_id, type
Sybaseまたは非ISO準拠構文は、できることの制限を解除します
group by
を含むクエリのselect
リストに含めるか省略します。
選択リストの列は、グループ化列およびベクトル集計で使用される列に限定されません。
Group byで指定された列は、選択リスト内の非集計列に限定されません。
例:
select type, title_id, avg(price), avg(advance)
from titles
group by type
Group byなしのsumのような集計関数を使用するには、over句を使用します。
参照: http://msdn.Microsoft.com/en-us/library/ms189461.aspx
例:
CREATE TABLE #a (ida int, name varchar(50))
CREATE TABLE #b (ida int, number int)
INSERT INTO #a VALUES(1,'one')
INSERT INTO #a VALUES(2,'two')
INSERT INTO #b VALUES(1,2)
INSERT INTO #b VALUES(1,3)
INSERT INTO #b VALUES(2,1)
SELECT DISTINCT a.ida, sum(number) OVER (PARTITION BY a.ida) FROM #a a
INNER JOIN #b b on a.ida = b.ida