【发布时间】:2015-09-03 12:16:31
【问题描述】:
我有一个销售表,其中显示了特定地区产品的当前季度平均值以及该产品上一季度的销售情况。我的表的结构类似于-
Region Product Year Qtr Month Sales
NORTH P1 2015 1 JAN 1000
SOUTH P1 2015 1 FEB 3000
NORTH P1 2015 1 MAR 3000
NORTH P1 2015 2 APR 4000
NORTH P1 2015 2 MAY 5000
NORTH P1 2015 2 JUN 6000
NORTH P1 2015 3 JUL 7000
NORTH P1 2015 3 AUG 8000
NORTH P1 2015 3 SEP 9000
NORTH P1 2015 4 OCT 1000
NORTH P1 2015 4 NOV 2000
NORTH P1 2015 4 DEC 4000
........
SOUTH P3 2015 4 NOV 3000
NORTH P1 2015 1 FEB 2000
SOUTH P1 2015 1 JAN 2000
SOUTH P1 2015 1 JAN 4000
SOUTH P2 2016 1 JAN 2000
SOUTH P2 2016 1 JAN 4000
NORTH P1 2016 1 MAR 3000
NORTH P1 2016 1 FEB 1000
NORTH P1 2016 1 JAN 2000
我有这种形式的输出-
Region Product Year Month Sales Qtr Avg_Sale Prev_Qtr_Sale
NORTH P1 2015 JAN 1000 1 2000 null
NORTH P1 2015 FEB 2000 1 2000 null
NORTH P1 2015 MAR 3000 1 2000 null
NORTH P1 2015 APR 4000 2 5000 2000
NORTH P1 2015 MAY 5000 2 5000 2000
NORTH P1 2015 JUN 6000 2 5000 2000
NORTH P1 2015 JUL 7000 3 8000 5000
NORTH P1 2015 AUG 8000 3 8000 5000
NORTH P1 2015 SEP 9000 3 8000 5000
NORTH P1 2015 OCT 1000 4 2333.3 8000
NORTH P1 2015 NOV 2000 4 2333.3 8000
NORTH P1 2015 DEC 4000 4 2333.33 8000
SOUTH P2 2015 JAN 8000 1 6000 null
SOUTH P2 2015 FEB 9000 1 6000 null
SOUTH P2 2015 MAR 1000 1 6000 null
SOUTH P2 2015 APR 2000 2 6333.33 6000
SOUTH P2 2015 MAY 8000 2 6333.33 6000
SOUTH P2 2015 JUN 9000 2 6333.33 6000
SOUTH P2 2015 JUL 1000 3 2333.33 6333.33
SOUTH P2 2015 AUG 2000 3 2333.33 6333.33
SOUTH P2 2015 SEP 4000 3 2333.33 6333.33
SOUTH P2 2015 OCT 5000 4 2666.67 2333.33
SOUTH P2 2015 NOV 2000 4 2666.67 2333.33
SOUTH P2 2015 DEC 1000 4 2666.67 2333.33
NORTH P3 2015 FEB 9000 1 5000 null
NORTH P3 2015 FEB 1000 1 5000 null
NORTH P3 2015 APR 2000 2 2000 5000
NORTH P3 2015 JUL 8000 3 8000 2000
SOUTH P3 2015 AUG 9000 3 9000 null
SOUTH P3 2015 OCT 1000 4 2000 9000
SOUTH P3 2015 NOV 3000 4 2000 9000
NORTH P1 2016 JAN 2000 1 2000 2333.33
NORTH P1 2016 FEB 1000 1 2000 2333.33
NORTH P1 2016 MAR 3000 1 2000 2333.33
SOUTH P2 2016 JAN 2000 1 3000 2666.67
SOUTH P2 2016 JAN 4000 1 3000 2666.67
SOUTH P1 2015 JAN 4000 1 3000 null
SOUTH P1 2015 JAN 2000 1 3000 null
SOUTH P1 2015 FEB 3000 1 3000 null
null 表示该产品在上一季度没有销售。 查询是-
WITH AvgSales
AS (SELECT
region,
product,
year,
qtr,
ROUND(AVG(sales), 2) AS avg_Sale
FROM sales
GROUP BY region,
product,
year,qtr
)
SELECT
s.region,
s.product,
s.year,
s.month,
s.sales,
avg.qtr,
avg.avg_Sale AS Qtr_Avg_Sale,
prev.avg_sale AS Prev_Qtr_Avg_Sale
FROM sales s
JOIN AvgSales avg
ON s.region = avg.region
AND s.product = avg.product
AND s.QTR = avg.qtr
AND s.year = avg.year
LEFT JOIN AvgSales prev
ON (s.region = prev.region
AND s.product = prev.product
AND s.year - 1 = prev.year
AND prev.qtr = 4) or
(s.region = prev.region
AND s.product = prev.product
AND s.year = prev.year
AND s.qtr - 1 = prev.qtr) ;
我在第二次连接中加入表时有疑问,表是如何作为连接条件加入的,为什么在这个连接条件下它不包括上一年的 2、3、4 季度
s.region = prev.region
AND s.product = prev.product
AND s.year - 1 = prev.year
AND prev.qtr = 4
谁能帮忙???
【问题讨论】:
-
我想知道为什么在这个加入条件下它不包括明年的第 2,3,4 季度,因为他们也满足这个条件..:( 为什么只有第一季度运行这个?
-
在我看来,可能有一些后续计算(可能在报告中?)需要上一年和/或上一季度(可能是百分比计算?)。如果没有更多关于如何使用该查询的知识,我们只能猜测。
-
我不明白你刚才说什么@X.L.Ant
-
在不知道查询要求的情况下,没有人能说出为什么总是包含 prev.Q4,而且不仅仅是 Q1。正如@Used_By_Already 所提到的,这可能是查询中的错误或其他任何错误
-
我已经说过的查询是用于计算上一季度的平均值,唯一的问题是为什么当它发现 qtr 2,3,4 这对我来说很神秘时它不起作用。
标签: oracle join common-table-expression