2014-10-17 34 views
0

我有一個表:在表格中合併行。 PostgreSQL的

CREATE TABLE sale_tender_t0 
(
    sten_bill bigint NOT NULL, 
    sten_paymentform smallint NOT NULL, 
    sten_tenderamount integer, 
    sten_changeamount integer, 
    sten_isfiscal character(1), 
    sten_accid integer, 
    sten_id bigserial NOT NULL, 
    sten_map_user integer, 
    sten_storeid integer NOT NULL 

和一些數據,如:

11246276310734;0;5000;2748;"0";;1913;;1 
11246277847093;0;25000;2083;"0";;1914;;1 
11246280935156;0;2254;0;"0";;1915;;1 
11246281048531;0;2240;100;"0";;1916;;1 
11246281345250;0;10000;1360;"0";;1917;;1 

sten_bill - 應該有獨特的數據,但有時會發生數據sten_bill被複制。使用 這個劇本我可以找到複製的數據:

select sten_bill from sale_tender_t0 GROUP by sten_bill 
HAVING count(*)>1; 

但我需要修復的表,例如:

11246276310734;0;5000;2748;"0";;1913;;1 
11246276310734;1;5000;2748;"0";;1913;;1 

應該修復,如:

11246276310734;1;10000;5496;"0";;1913;;1 

刪除第一列,並更改第二列數據column2.sten_tenderamount + column1.sten_tenderamountcolumn2.sten_changeamount + column2.sten_changeamount

+0

您需要某種獨特的標識符A.K.A. '主鍵'爲了區分行。 – 2014-10-17 12:27:07

+0

不相關,但是:對'sten_isfiscal'這樣的標誌使用真正的'boolean'更爲簡潔 – 2014-10-17 12:38:41

回答

2
WITH max_id_and_summed_amounts AS (
    SELECT 
    sten_bill, 
    SUM(sten_tenderamount) AS sten_tenderamount, 
    SUM(sten_changeamount) AS sten_changeamount, 
    MAX(sten_id) AS sten_id 
    FROM 
    sale_tender_t0 
    GROUP BY 
    sten_bill 
    HAVING 
    COUNT(*)>1 
), 
newest_line AS (
    SELECT 
    miasa.sten_bill, 
    stt.sten_paymentform, 
    miasa.sten_tenderamount, 
    miasa.sten_changeamount, 
    stt.sten_isfiscal, 
    stt.sten_accid, 
    miasa.sten_id, 
    stt.sten_map_user, 
    stt.sten_storeid 
    FROM 
    max_id_and_summed_amounts miasa INNER JOIN sale_tender_t0 stt 
    ON 
    miasa.sten_id=stt.sten_id 
), 
deleted_rows AS (
    DELETE FROM 
    sale_tender_t0 
    WHERE 
    sten_bill IN (
     SELECT 
     sten_bill 
     FROM 
     max_id_and_summed_amounts 
    ) 
) 
INSERT INTO 
    sale_tender_t0 
SELECT 
    * 
FROM 
    newest_line; 

編輯:PostgreSQL 8.4及更高版本不支持Common Table Expressions,因此您需要使用臨時表。

CREATE TEMPORARY TABLE max_id_and_summed_amounts 
    AS 
SELECT 
    sten_bill, 
    SUM(sten_tenderamount) AS sten_tenderamount, 
    SUM(sten_changeamount) AS sten_changeamount, 
    MAX(sten_id) AS sten_id 
FROM 
    sale_tender_t0 
GROUP BY 
    sten_bill 
HAVING 
    COUNT(*)>1; 

CREATE TEMPORARY TABLE newest_line 
    AS 
SELECT 
    miasa.sten_bill, 
    stt.sten_paymentform, 
    miasa.sten_tenderamount, 
    miasa.sten_changeamount, 
    stt.sten_isfiscal, 
    stt.sten_accid, 
    miasa.sten_id, 
    stt.sten_map_user, 
    stt.sten_storeid 
FROM 
    max_id_and_summed_amounts miasa INNER JOIN sale_tender_t0 stt 
ON 
    miasa.sten_id=stt.sten_id; 

DELETE FROM 
    sale_tender_t0 
WHERE 
    sten_bill IN (
    SELECT 
     sten_bill 
    FROM 
     max_id_and_summed_amounts 
); 

INSERT INTO 
    sale_tender_t0 
SELECT 
    * 
FROM 
    newest_line; 

DROP TABLE max_id_and_summed_amounts; 
DROP TABLE newest_line; 
+0

您可以將'returns *'添加到最終的'select'中以查看聚合的行。 – 2014-10-17 12:38:07

+0

錯誤:在「刪除」處或附近出現語法錯誤 線20:從 – Sanyo4ever 2014-10-17 12:43:27

+0

刪除剛剛發現相同的問題,謝謝馬,我相應地編輯了答案。否則,它會抱怨'丟失FROM子句條目表'duplicate_rows'' – 2014-10-17 12:45:47