如何将类似记录转换为一个记录和反映oracle表中的单个时间

时间:2018-04-05 05:35:51

标签: sql oracle

在一个表格中, tbl1 数据就像 -

ID     Desc. Amount  Org.     Date
1001   abc   125     Equity   12-Mar-18
1001   abc    50     Equity   12-Mar-18
1001   def   150     Market   12-Mar-18
1001   def   200     Market   12-Mar-18   
1001   def   100     Market   12-Mar-18

但由于数据重复,我想要同一个组织,数量将是 SUM ,数据将仅为单次&像智者一样反映到表中 -

ID     Desc. Amount  Org.     Date
1001   abc   175     Equity   12-Mar-18
1001   def   450     Market   12-Mar-18   

我希望以上5个数据替换为低于2的数据并存储到表中。装置5数据替换为这两个数据&只有这两个数据反映在桌面上。

3 个答案:

答案 0 :(得分:2)

这称为aggregation,这是你尚未完成的事情

select ID, Desc, sum(Amount) Amount, Org, Date
from table t
group by ID, Desc, Org, Date

答案 1 :(得分:1)

暂时存储记录,截断然后重新插入将是一种选择,特别是如果您的数据很大。

另一种作为两步流程的方法,即在不截断或创建DDL的情况下,将所有金额更新为所需值,然后删除重复项。

UPDATE tbl1 t1
SET Amount = (
        SELECT sum(Amount)
        FROM tbl1 t2
        WHERE t2.ID = t1.ID
            AND t2.Descr = t1.Descr
            AND t2.Org = t1.Org
            AND t2.Date_t = t1.Date_t
        );

DELETE
FROM tbl1
WHERE rowid NOT IN (
        SELECT MIN(rowid)
        FROM tbl1
        GROUP BY ID
            ,Descr
            ,Amount
            ,Org
            ,Date_t
        )  ;

Demo

答案 2 :(得分:1)

您可以使用MERGE语句和分析函数在单个语句中执行此操作:

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE table_name ( ID, "Desc", Amount, Org, "Date" ) AS
  SELECT 1001, 'abc', 125, 'Equity', DATE '2018-03-12' FROM DUAL UNION ALL
  SELECT 1001, 'abc',  50, 'Equity', DATE '2018-03-12' FROM DUAL UNION ALL
  SELECT 1001, 'def', 150, 'Market', DATE '2018-03-12' FROM DUAL UNION ALL
  SELECT 1001, 'def', 200, 'Market', DATE '2018-03-12' FROM DUAL UNION ALL
  SELECT 1001, 'def', 100, 'Market', DATE '2018-03-12' FROM DUAL;

查询1

MERGE INTO table_name dst
USING (
  SELECT ROWID rid,
         SUM( Amount ) OVER (
             PARTITION BY ID, "Desc", Org, "Date"
           ) AS Amount,
         ROW_NUMBER() OVER (
             PARTITION BY ID, "Desc", Org, "Date"
             ORDER BY ROWNUM
           ) AS rn
  FROM    table_name
) src
ON ( src.rid = dst.ROWID )
WHEN MATCHED THEN
  UPDATE SET Amount = src.Amount
  DELETE WHERE rn > 1

查询2

SELECT * FROM table_name

<强> Results

|   ID | Desc | AMOUNT |    ORG |                 Date |
|------|------|--------|--------|----------------------|
| 1001 |  abc |    175 | Equity | 2018-03-12T00:00:00Z |
| 1001 |  def |    450 | Market | 2018-03-12T00:00:00Z |