web-dev-qa-db-ja.com

結合で集計関数を使用するときにGroupBy句を使用するにはどうすればよいですか?

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

ItemIDCustomerIDJobOrderID、および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条項について提案してください。

7
thevan

GROUP BYは、指定された列の一意の組み合わせに対して集計を行います(sum、minなど)。 GROUP BY句または集計関数で列名を指定しない場合、SQLエンジンは、その種類の列に対してどの値を返す必要があるかを認識できません。

8
Piotr Auguscik

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

参照 クエリ結果をグループに整理する:group by句

Sybaseまたは非ISO準拠構文は、できることの制限を解除しますgroup byを含むクエリのselectリストに含めるか省略します。

  • 選択リストの列は、グループ化列およびベクトル集計で使用される列に限定されません。

  • Group byで指定された列は、選択リスト内の非集計列に限定されません。

例:

select type, title_id, avg(price), avg(advance) 
from titles 
group by type 
5
Akram Shahda

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
2
Andreas