Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按合并数据的日期和数量分组以创建新列_Sql_Oracle_Date_Group By - Fatal编程技术网

Sql 按合并数据的日期和数量分组以创建新列

Sql 按合并数据的日期和数量分组以创建新列,sql,oracle,date,group-by,Sql,Oracle,Date,Group By,我是SQL的初学者,希望按日期/num对加入的数据进行分组,以创建一个新列。拉取数据后,我的数据如下所示: select items.A, items.B, items.C, items.NUM, items.E, source.QTY, dates.DATE from original_metric source inner join grocery items on items.id = source.item_id inner

我是SQL的初学者,希望按日期/num对加入的数据进行分组,以创建一个新列。拉取数据后,我的数据如下所示:

select
    items.A,
    items.B,
    items.C,
    items.NUM,
    items.E,
    source.QTY,
    dates.DATE
from original_metric source
inner join grocery items
    on items.id = source.item_id
inner join day_dates dates
    on dates.date_id = source.date_id;

    A        B     C   NUM   E    QTY    DATE       
Vegetable carrot  John  1  Main   14  26-APR-11
Vegetable carrot  John  1  Main   35  27-APR-11
Vegetable carrot  John  1  Main    2  21-SEP-15
Vegetable carrot  John  1  Main   11  23-APR-17
Vegetable carrot  John  1  Main   25  22-MAY-17
Vegetable carrot  John  1  Main   20  20-APR-18
Vegetable onion   John  2  Extra  23  02-AUG-16
Vegetable onion   John  2  Extra  32  07-AUG-16
Meat      pork    Jane  3  Main   10  02-AUG-16
Meat      pork    Jane  3  Main   60  19-JAN-17
Meat      pork    Jane  3  Main   12  25-DEC-17
我希望它看起来像什么:

   A         B      C  NUM   E    QTY         DATE           QTR      WEEK_FILL    CURRENT_FILL 
Vegetable carrot  John  1  Main   49  24-APR-11:30-APR-11  2011Q4   none         100%
Vegetable carrot  John  1  Main    2  20-SEP-15:15-SEP-15  2015Q2   none         100% 
Vegetable carrot  John  1  Main   11  23-APR-17:29-APR-17  2017Q4   22.4%        73.4%
Vegetable carrot  John  1  Main   25  21-MAY-17:27-MAY-17  2017Q4   51%          73.4% 
Vegetable carrot  John  1  Main   20  15-APR-18:21-APR-18  2018Q4   80%          80% 
Vegetable onion   John  2  Extra  55  31-JUL-16:07-AUG-16  2016Q1   none         100%
Meat      pork    Jane  3  Main   10  31-JUL-16:07-AUG-16  2016Q1   none         100%
Meat      pork    Jane  3  Main   60  15-JAN-17:21-JAN-17  2017Q3   none         100%
Meat      pork    Jane  3  Main   12  24-DEC-17:30-DEC-17  2017Q3   none         100%
我想按周按数量分组数量。然后根据日期,显示它属于哪个QTR

然后,对于WEEK_FILL,我尝试合并以下逻辑:数量(在该周)除以总和(上一年同一季度的所有数量)除以NUM。如果没有上一年,则继续返回,直到有一个匹配的季度。否则,如果没有以前的年份,则将其保留为“无”

然后,对于当前的填充,我尝试合并一个类似的逻辑: sum(该季度的所有数量)除以sum(上一年同一季度的所有数量)除以NUM。如果没有上一年,则再往回走,直到有一个匹配的季度。否则,如果没有以前的年份,则保留为100%

(供参考,会计日历第一季度:六月、七月、八月;第二季度:九月、十月、十一月;第三季度:十二月、一月、二月;第四季度:三月、四月、五月)

尝试此查询

WITH dataCTE AS(
  SELECT
    q.*,
    DENSE_RANK()OVER(PARTITION BY q.NUM,q.Q ORDER BY q.Y) Y_ORDER
  FROM
    (
      SELECT
        d.*,
        EXTRACT(YEAR FROM DT) Y,
        -- Q1: JUN, JUL, AUG; Q2: SEP, OCT, NOV; Q3: DEC, JAN, FEB; Q4: MAR, APR, MAY
        DECODE(EXTRACT(MONTH FROM DT),6,1,7,1,8,1,9,2,10,2,11,2,12,3,1,3,2,3,3,4,4,4,5,4) Q
      FROM TEST_DATA d
    ) q
)    
SELECT
  d.*,
  Y||'Q'||Q QTR,
  NVL(TO_CHAR(100*d.QTY/
    (
      SELECT SUM(p.QTY)
      FROM dataCTE p
      WHERE p.Y_ORDER=d.Y_ORDER-1
        AND p.Q=d.Q
        AND p.NUM=d.NUM
    ),'9999.99'),'none') WEEK_FILL,
  NVL(100*SUM(d.QTY)OVER(PARTITION BY d.Y,d.Q ORDER BY d.DT RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)/
    (
      SELECT SUM(p.QTY)
      FROM dataCTE p
      WHERE p.Y_ORDER=d.Y_ORDER-1
        AND p.Q=d.Q
        AND p.NUM=d.NUM
    ),100) CURRENT_FILL
FROM dataCTE d
第二种变体

WITH dataCTE AS(
  SELECT
    q.*,
    DENSE_RANK()OVER(PARTITION BY q.NUM,q.Q ORDER BY q.Y) Y_ORDER
  FROM
    (
      SELECT
        d.*,
        EXTRACT(YEAR FROM DT) Y,
        -- Q1: JUN, JUL, AUG; Q2: SEP, OCT, NOV; Q3: DEC, JAN, FEB; Q4: MAR, APR, MAY
        DECODE(EXTRACT(MONTH FROM DT),6,1,7,1,8,1,9,2,10,2,11,2,12,3,1,3,2,3,3,4,4,4,5,4) Q
      FROM TEST_DATA d
    ) q
)
SELECT
  d.*,
  d.Y||'Q'||d.Q QTR,
  NVL(TO_CHAR(100*d.QTY/p.PREV_QTY,'9999.99'),'none') WEEK_FILL,
  NVL(100*SUM(d.QTY)OVER(PARTITION BY d.Y,d.Q ORDER BY d.DT RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)/
      p.PREV_QTY,100) CURRENT_FILL
FROM dataCTE d
LEFT JOIN
  (
    SELECT Y_ORDER,Q,NUM,SUM(QTY) PREV_QTY
    FROM dataCTE
    GROUP BY Y_ORDER,Q,NUM
  ) p
ON p.Y_ORDER=d.Y_ORDER-1 AND p.Q=d.Q AND p.NUM=d.NUM
TEST\u DATA
是您的查询

CREATE TABLE TEST_DATA(
  A varchar2(20),
  B varchar2(20),
  C varchar2(20),
  NUM number,
  E varchar2(20),
  QTY number,
  DT date
);

INSERT INTO TEST_DATA(A,B,C,NUM,E,QTY,DT)VALUES('Vegetable','carrot','John',1,'Main',14,'26-APR-11');
INSERT INTO TEST_DATA(A,B,C,NUM,E,QTY,DT)VALUES('Vegetable','carrot','John',1,'Main',35,'27-APR-11');
INSERT INTO TEST_DATA(A,B,C,NUM,E,QTY,DT)VALUES('Vegetable','carrot','John',1,'Main', 2,'21-SEP-15');
INSERT INTO TEST_DATA(A,B,C,NUM,E,QTY,DT)VALUES('Vegetable','carrot','John',1,'Main',11,'23-APR-17');
INSERT INTO TEST_DATA(A,B,C,NUM,E,QTY,DT)VALUES('Vegetable','carrot','John',1,'Main',25,'22-MAY-17');
INSERT INTO TEST_DATA(A,B,C,NUM,E,QTY,DT)VALUES('Vegetable','carrot','John',1,'Main',20,'20-APR-18');
INSERT INTO TEST_DATA(A,B,C,NUM,E,QTY,DT)VALUES('Vegetable','onion','John',2,'Extra',23,'02-AUG-16');
INSERT INTO TEST_DATA(A,B,C,NUM,E,QTY,DT)VALUES('Vegetable','onion','John',2,'Extra',32,'07-AUG-16');
INSERT INTO TEST_DATA(A,B,C,NUM,E,QTY,DT)VALUES('Meat','pork','Jane',3,'Main',10,'02-AUG-16');
INSERT INTO TEST_DATA(A,B,C,NUM,E,QTY,DT)VALUES('Meat','pork','Jane',3,'Main',60,'19-JAN-17');
INSERT INTO TEST_DATA(A,B,C,NUM,E,QTY,DT)VALUES('Meat','pork','Jane',3,'Main',12,'25-DEC-17');
SQL Fiddle: 1 - 2-


但是我认为对于
2018Q4
来说
80%
是错误的,因为
20/(11+25)=55.56

数据在您的预期输出中似乎是错误的。日期范围应为一周的第一天到最后一天。。请纠正第一个。对不起,我想我被你的意思弄糊涂了。日期结构当前为dd-MONTH-yy:dd-MONTH-yy,对于预期输出中的第一行,2011年4月26日和27日都在11年4月24日:11年4月30日John的两个洋葱发生了什么事?两个洋葱行被分组(数量23+32=>55),因为两个日期在同一周内。