web-dev-qa-db-ja.com

SUM関数でINNER JOINおよびGROUP BY SQLを使用しようとしていますが、機能していません

私はこれについて頭を悩ませていませんし、誰かがこれで私を助けることができるのではないかと思いました。

RES_DATAINV_DATAという2つのテーブルがあります

RES_DATA以下のように私の顧客が含まれています

CUSTOMER ID | NAME

1, Robert
2, John
3, Peter

INV_DATA以下のように彼らの請求書が含まれています

INVOICE ID | CUSTOMER ID | AMOUNT

100, 1, £49.95
200, 1, £105.95
300, 2, £400.00
400, 3, £150.00
500, 1, £25.00

私はSELECTステートメントを書き込もうとしていますが、これは以下のような結果をもたらします。

CUSTOMER ID | NAME | TOTAL AMOUNT

1, Robert, £180.90
2, John, £400.00
3, Peter, £150.00

Customerテーブルによってグループ化されたINVOICESテーブルのテーブルとSUM値を何らかの方法で追加するには、2つの内部結合が必要だと思いますが、正直なところ、何かが足りないと思います。必要な結果に近づくことさえできません。

13
Rob4236

これは動作するはずです。

SELECT a.[CUSTOMER ID], a.[NAME], SUM(b.[AMOUNT]) AS [TOTAL AMOUNT]
FROM RES_DATA a INNER JOIN INV_DATA b
ON a.[CUSTOMER ID]=b.[CUSTOMER ID]
GROUP BY a.[CUSTOMER ID], a.[NAME]

SQL Fiddle SQL Server 2008に対してテストしました: http://sqlfiddle.com/#!3/1cad5/1

基本的にここで行われているのは、結合のために、「左」に同じ行を取得しているということです(つまり、RES_DATAテーブル)「右側」のすべての行(つまり、INV_DATAテーブル)同じ[CUSTOMER ID]値。左側の列だけでグループ化し、[AMOUNT]列を右側から挿入します。左側から1行をそのまま保持し、右側から一致する値を合計します。

21
rory.ap

それを行う2つの方法...

GROUP BY

SELECT RES.[CUSTOMER ID], RES,NAME, SUM(INV.AMOUNT) AS [TOTAL AMOUNT]
FROM RES_DATA RES
JOIN INV_DATA INV ON RES.[CUSTOMER ID] INV.[CUSTOMER ID]
GROUP BY RES.[CUSTOMER ID], RES,NAME

オーバー

SELECT RES.[CUSTOMER ID], RES,NAME, 
       SUM(INV.AMOUNT) OVER (PARTITION RES.[CUSTOMER ID]) AS [TOTAL AMOUNT]
FROM RES_DATA RES
JOIN INV_DATA INV ON RES.[CUSTOMER ID] INV.[CUSTOMER ID]
6
Hogan

サブクエリを使用

SELECT * FROM RES_DATA inner join (SELECT [CUSTOMER ID], sum([TOTAL AMOUNT]) FROM INV_DATA group by [CUSTOMER ID]) T on RES_DATA.[CUSTOMER ID] = t.[CUSTOMER ID]