【问题标题】:How join in this query work?加入此查询如何工作?
【发布时间】: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


【解决方案1】:

我很确定 Prev_Qtr_Sale 列的目的是在 QtrYear 列中显示紧接一年前一个季度的平均销售额 - 所以对于 Qtr 2 of @987654325 @ 2015,应显示 2015 年第一季度的平均值,依此类推。

如果是这样,那么在加入prev-aliased CTE 的第一组条件中有遗漏;这组条件应该专门针对Qtr为1的特殊情况(所以加入到上一年的最后一个季度),但条件s.qtr = 1被省略了。

因此,完整连接条件应如下所示:

LEFT JOIN AvgSales prev
ON  (s.region = prev.region
AND s.product = prev.product
AND s.year - 1 = prev.year
AND s.qtr = 1 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多