根据两列的分组插入表数据

时间:2018-03-26 07:06:22

标签: sql oracle sql-insert

我有一个具有以下格式的oracle表, 例如:

JLID    Dcode   SID     TDT            QTY  
8295783 3119255 9842    3/5/2018        14  
8269771 3119255 9842    3/6/2018        11  
8302211 3119255 1126    3/1/2018        19

这里我对同一个Dcode有不同的SID,现在我需要获得最大数量的SID。 (即)对于SID 9842 - (14 + 11)= 25,对于SID 1126它是19,那么结果应该在SID 9842.所以,我们的查询应该返回以下结果

JLID    Dcode   START_DT    END_DT           SID       
111    3119255  3/1/2018    3/31/2018 12:00  9842   

Startdate和enddate应该从TDT计算(即)开始日期是该月的第一个日期,结束日期是该月的最后一个日期 任何人都可以建议我做一些想法。

2 个答案:

答案 0 :(得分:2)

这是一个在最终结果中不包含JLID = 111的选项,因为我不知道你从哪里拿到它。

SQL> with test (jlid, dcode, sid, tdt, qty) as
  2        (select 8295783, 3119255, 9842, date '2018-03-05', 14 from dual union
  3         select 8269771, 3119255, 9842, date '2018-08-22', 11 from dual union
  4         select 8302211, 3119255, 1126, date '2018-03-01', 19 from dual union
  5         --
  6         select 1234567, 1112223, 1000, date '2018-06-16', 88 from dual
  7        )
  8    select dcode,
  9           min (trunc (tdt, 'mm')) start_dt,      --> MIN
 10           max (last_day (tdt)) end_dt,           --> MAX
 11           sid
 12      from (select dcode,
 13                   sid,
 14                   tdt,
 15                   sqty,
 16                   rank () over (partition by dcode order by sqty desc) rnk
 17              from (select dcode,
 18                           sid,
 19                           tdt,
 20                           sum (qty) over (partition by dcode, sid) sqty
 21                      from test))
 22     where rnk = 1
 23  group by dcode, sid;                                   --> GROUP BY

     DCODE START_DT         END_DT                  SID
---------- ---------------- ---------------- ----------
   1112223 01.06.2018 00:00 30.06.2018 00:00       1000
   3119255 01.03.2018 00:00 31.08.2018 00:00       9842

SQL>

答案 1 :(得分:2)

可能就是这么简单:

SELECT Dcode, start_date, end_date, SID FROM (
    SELECT Dcode, SID, TRUNC(start_date, 'MONTH') AS start_date
         , LAST_DAY(end_date) AS end_date
         , ROW_NUMBER() OVER ( PARTITION BY Dcode ORDER BY total_qty DESC ) AS rn
      FROM (
        SELECT Dcode, SID, MIN(TDT) AS start_date, MAX(TDT) AS end_date
             , SUM(QTY) AS total_qty
          FROM mytable
         GROUP BY Dcode, SID
    )
) WHERE rn = 1

在最内部子查询中,我聚合以获取DcodeSID的特定值的日期范围和总数量。然后我使用anaylitic(窗口)函数来获取总数量最大的行。 (如果您想要返回多个具有相同数量的SID值,您可能希望使用RANK()代替ROW_NUMBER()。)