Sql 按合并数据的日期和数量分组以创建新列
我是SQL的初学者,希望按日期/num对加入的数据进行分组,以创建一个新列。拉取数据后,我的数据如下所示: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
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),因为两个日期在同一周内。