Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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 Oracle子查询问题,查找上一年和本年销售产品数量之间的差异_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql Oracle子查询问题,查找上一年和本年销售产品数量之间的差异

Sql Oracle子查询问题,查找上一年和本年销售产品数量之间的差异,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我不熟悉Oracle数据库,但对Teradata和MSSQL有很好的经验 在学习oracle时,我面临一个概念上的困惑,如下两个表: Create table PRODUCTS ( PRODUCT_ID INTEGER NOT NULL PRIMARY KEY, PRODUCT_NAME VARCHAR2(30) ); CREATE TABLE SALES ( SALE_ID INTEGER NOT NULL PRIMARY KEY, PRODUCT_ID INTEGER, YEAR INT

我不熟悉Oracle数据库,但对Teradata和MSSQL有很好的经验 在学习oracle时,我面临一个概念上的困惑,如下两个表:

  Create table PRODUCTS
(
PRODUCT_ID INTEGER NOT NULL PRIMARY KEY,
PRODUCT_NAME VARCHAR2(30)
);
CREATE TABLE SALES
(
SALE_ID INTEGER NOT NULL PRIMARY KEY,
PRODUCT_ID INTEGER,
YEAR INTEGER,
QUANTITY INTEGER,
PRICE INTEGER,
FOREIGN KEY(PRODUCT_ID) REFERENCES PRODUCTS(PRODUCT_ID)
);
表中的示例值为:

    INSERT INTO PRODUCTS VALUES ( 100, 'A');
INSERT INTO PRODUCTS VALUES ( 200, 'B');
INSERT INTO PRODUCTS VALUES ( 300, 'C');
INSERT INTO PRODUCTS VALUES ( 400, 'D');
INSERT INTO SALES VALUES ( 1, 100, 2010, 25, 5000);
INSERT INTO SALES VALUES ( 2, 100, 2011, 16, 5000);
INSERT INTO SALES VALUES ( 3, 100, 2012, 8,  5000);
INSERT INTO SALES VALUES ( 4, 200, 2010, 10, 9000);
INSERT INTO SALES VALUES ( 5, 200, 2011, 15, 9000);
INSERT INTO SALES VALUES ( 6, 200, 2012, 20, 9000);
INSERT INTO SALES VALUES ( 7, 300, 2010, 20, 7000);
INSERT INTO SALES VALUES ( 8, 300, 2011, 18, 7000);
INSERT INTO SALES VALUES ( 9, 300, 2012, 20, 7000);
我的目标是从该表中找到以下内容: ****编辑**** 我的预期结果是: 解释 对于产品,假设“A”数量差异=(当前年数量-上一年数量),如果数量差异大于0,则应仅显示产品名称。 在上述情况下: 输出将是
/**我们只需要将上一年的销售数量与本年的销售数量进行比较,如果本年的销售数量大于上一年,我们需要显示该产品名称**/

Product_Name
--------------------
B
C
1-产品数量与其上一年数量之间的差异

为此,我使用以下查询:

SELECT
 PRODUCT_NAME
 from
 (
    SELECT
           P.PRODUCT_NAME,
           P.PRODUCT_ID,
           S.PRODUCT_ID,
          ((S.QUANTITY)-(LEAD(S.QUANTITY,1,0) OVER (PARTITION BY P.PRODUCT_ID ORDER BY S.YEAR DESC))) AS QUANTITY_DIFFERENCE
    FROM
         PRODUCTS P,
         SALES S
    WHERE 
         QUANTITY_DIFFERENCE>=0
    )A 
     GROUP BY PRODUCT_NAME
    ;
它给出了以下错误,我试图修复它,但无法实现更正

ORA-00904: "QUANTITY_DIFFERENCE": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
已编辑 我刚刚通过folk的建议纠正了之前的错误,现在我修改的查询是:

   SELECT
     PRODUCT_NAME,
     QUANTITY_DIFFERENCE
     from
     (
        SELECT PRODUCT_NAME,
               QUANTITY_DIFFERENCE FROM (
          SELECT
               P.PRODUCT_NAME,
               P.PRODUCT_ID,
               S.PRODUCT_ID,
              ((S.QUANTITY)-(LEAD(S.QUANTITY,1,0) OVER (PARTITION BY P.PRODUCT_ID ORDER BY S.YEAR DESC))) AS QUANTITY_DIFFERENCE
        FROM
             PRODUCTS P,
             SALES S
        ) WHERE 
             QUANTITY_DIFFERENCE>=0
        )A 
         GROUP BY PRODUCT_NAME,
         HAVING QUANTITY_DIFFERENCE>=0
        ;
但现在我收到以下错误:

ORA-00936: missing expression
00936. 00000 -  "missing expression"
*Cause:    
*Action:

Please also guide me for the correct logical approach for achieving the objective of "Finding the difference between current year quantity and previous years' quantity. For example suppose the 2011 quantity was 10 and 2012 quantity was 8 then it should -2 but currently i need to show only quantities difference which is having difference more than zero. 

你们能指导我如何解决这个问题吗?有没有其他方法来编写相同的查询?

无需
分组方式。但是你必须指定你的当前年份。否则,您的查询将开始考虑多年的数据集,这听起来不像您想要的

select p.product_name
  from (select s.*,
               s.quantity - lag(s.quantity) over (partition by product_id order by year) as qty_diff
          from sales s) s
  join products p
    on p.product_id = s.product_id
 where s.year = 2012 -- set your current year here
   and s.qty_diff > 0

谢谢你的指导,我的分数少了,所以我不能投票,但我已经接受了你的答案:)