2016-04-10 4 views
5

次のようになりますテーブルを想像してみて:重複したレコードがあるPostgresデータベース内の異なるレコードをどのようにSUMにSUMすることができますか?

table with duplicate data

このデータを取得するためのSQLだけでSELECTした* 最初のカラム第二は、「ID」である「ROW_ID」である - 注文IDであると3番目は「合計」です。これが収益です。

データベースに重複する行があるのはなぜか分かりませんが、SUM(合計)を実行すると、注文IDが同じであっても自分のデータベースの2番目のエントリが含まれています数値がdistinct(id)を選択した場合よりも大きくなり、total - excelを実行して値を手動で合計します。

私の質問は - 別の注文IDの行だけをエクスポートする場合と同じ収入を得るために、どのように別の注文IDだけでSUMを計算できますか?

ありがとうございます!

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-uploadを-images-of-code-on-so-asking-a-question/285557#285557 –

答えて

1

あなたは(あなたの例で)このような何かを試すことができます。

create table test (
    row_id int, 
    id int, 
    total decimal(15,2) 
); 

insert into test values 
(6395, 1509, 112), (22986, 1509, 112), 
(1393, 3284, 40.37), (24360, 3284, 40.37); 

クエリ

with distinct_records as (
    select distinct id, total from test 
) 

select a.id, b.actual_total, array_agg(a.row_id) as row_ids 
from test a 
inner join (select id, sum(total) as actual_total from distinct_records group by id) b 
    on a.id = b.id 
group by a.id, b.actual_total 

結果

| id | actual_total | row_ids | 
|------|--------------|------------| 
| 1509 |   112 | 6395,22986 | 
| 3284 |  40.37 | 1393,24360 | 

説明

我々は理由が異なるROW_IDで複数回表示される注文と合計何のためにあるのかわかりません。したがって、with ...というフレーズを使用して共通テーブル式(CTE)を使用すると、個別のIDと合計が取得されます。

CTEでは、この別個のデータを使用して合計を行います。私たちは元のテーブルのIDを別個の値にわたる集約と結合します。次に、情報がよりきれいに見えるように、row_idsをカンマ区切りにします。

SQLFiddle例

http://sqlfiddle.com/#!15/72639/3

+0

ありがとうございました!私は今これを試してみよう!とても有難い!!! –

+0

この回答は、@ KatieFに役立ったか? – zedfoxus

0

我々は1つの注文の合計が実際に1行であることを信頼することができた場合。 PK id列のMAXを選択することにより、サブクエリの重複を排除できます。例:

CREATE TABLE test2 (id int, order_id int, total int); 

insert into test2 values (1,1,50); 
insert into test2 values (2,1,50); 
insert into test2 values (5,1,50); 
insert into test2 values (3,2,100); 
insert into test2 values (4,2,100); 

select order_id, sum(total) 
    from test2 t 
    join (
    select max(id) as id 
     from test2 
     group by order_id) as sq 
    on t.id = sq.id 
    group by order_id 

sql fiddle

5

簡単 - ちょうど数で割る:

select id, sum(total)/count(id) 
from orders 
group by id 

はまた重複の任意のレベルを処理し、例えば三重など

+0

これはとても賢いです! – rat

1

あなたは集約関数でDISTINCTを使用することができます。ここ

SELECT id, SUM(DISTINCT total) FROM orders GROUP BY id 

ドキュメント:https://www.postgresql.org/docs/9.6/static/sql-expressions.html#SYNTAX-AGGREGATES

+0

これを削除するつもりはありませんが、実際は間違っています*。集計関数の中で 'distinct'を使うと、それは列の別個の値を取得します。したがって、同じ合計で別個の注文がある場合、合計は不正確になります。 'sum(total)/ count(id)'がこれを獲得します。 –

関連する問題