web-dev-qa-db-ja.com

SQL Sum複数行を1つに

SUM機能のサポートが必要です。同じアカウントの請求額を合計して1つの総計にしようとしていますが、結果には、SUM列が最初の列の3倍になっています。

模擬データの結果として必要なものは次のとおりです。

AccountNumber    Bill      BillDate   
1                100.00    1/1/2013     
1                150.00    2/1/2013   
1                200.00    3/1/2013 
2                75.00     1/1/2013  
2                100.00    2/1/2013   

クエリ:

SELECT AccountNumber, Bill, BillDate, SUM(Bill)
FROM Table1
GROUP BY AccountNumber, Bill, BillDate


AccountNumber    Bill      BillDate    SUM(Bill)
1                100.00    1/1/2013    450.00    
1                150.00    2/1/2013    450.00
1                200.00    3/1/2013    450.00
2                75.00     1/1/2013    175.00
2                100.00    2/1/2013    175.00

OR

AccountNumber    Bill      SUM(Bill)
1                100.00    450.00    
2                75.00     175.00

可能であれば、両方の結果を得たいと思います。

ここに私が得ているものがあります:

私のSUM列は3倍になっていますが、実際にはアカウント番号に基づいてデータを合計しているわけではありません。

AccountNumber    Bill      BillDate    SUM(Bill)
1                100.00    1/1/2013    300.00    
1                150.00    2/1/2013    450.00
1                200.00    3/1/2013    600.00
2                75.00     1/1/2013    225.00
2                100.00    2/1/2013    300.00
9
Jason

ご回答ありがとうございます。私の問題は、ロジックではなく、エントリの重複によるデータベースの問題だったことがわかりました。クイックテーブル同期により修正され、SUM機能は期待どおりに機能しました。これはすべてSUM機能の有用な知識であり、使用に問題がある場合は読む価値があります。

0
Jason

結果をグループ化したくない場合は、ウィンドウ関数を使用します。

DBMSを記述していませんが、これはANSI SQLです。

SELECT AccountNumber, 
       Bill, 
       BillDate, 
       SUM(Bill) over (partition by accountNumber) as account_total
FROM Table1
order by AccountNumber, BillDate;

SQLFiddleは次のとおりです。 http://sqlfiddle.com/#!15/2c35e/1

以下を追加することにより、実行中の合計を追加することもできます。

sum(bill) over (partition by account_number order by bill_date) as sum_to_date

現在の行の日付までの合計が表示されます。

11

BillDateでグループ化していますが、請求日はアカウントごとに異なるため、行はグループ化されません。考えてみると、それは理にかなっていない-彼らは異なる法案であり、異なる日付を持っています。 Billについても同じことが言えます。アカウントの請求書を合計しようとしていますが、なぜそれでグループ化するのですか?

BillDateBillをselect句とgroup by句から除外すると、正しい結果が得られます。

SELECT AccountNumber, SUM(Bill)
FROM Table1
GROUP BY AccountNumber
7
Dave Zych

SUMを適用するフィールドでグループ化し、COUNT、SUM、AVEなどの複数行の値以外のフィールドをSELECTに含めないでください。この場合のようにBillフィールドを含めると、最初の値のみ行のセットが表示されますが、ほとんど意味がなく、混乱を招きます。

これにより、アカウント番号ごとの請求額の合計が返されます。

SELECT SUM(Bill) FROM Table1 GROUP BY AccountNumber

必要に応じて、WHERE、ORDER BYなどの句を追加できます。

3
jvicab

これを試しましたが、集計関数またはGROUP BY句のいずれにも含まれていないため、selectステートメントで自分のフィールドが無効であるというメッセージは表示されません。そこに留めておかなければなりません。これを回避する方法はありますか?

自己結合を行う必要があります。同じサブクエリで非集計データを集計および保持することはできません。例えば。

select q2.AccountNumber, q2.Bill, q2.BillDate, q1.BillSum
from
(
SELECT AccountNumber, SUM(Bill) as BillSum
FROM Table1
GROUP BY AccountNumber
) q1,
(
select AccountNumber, Bill, BillDate
from table1
) q2
where q1.AccountNumber = q2.AccountNumber
1
ubanerjea