计算一个财政年度的产品购买| SQL服务器

时间:2018-08-26 07:44:53

标签: sql-server-2008

我想找出两个财政年度( 17-17财年和17-18财年)的产品购买情况。

要解决这个问题:

  1. 所有者ID: 101 ,第一次购买是在2014年,在2017-18财年进行了3次购买。

  2. 所有者ID: 102 ,第一次购买是在2011年,在16-17财年进行了1次购买,在17-18财年进行了1次购买。

  3. 所有者ID: 103 ,第一次购买是在2017年,但是不应被认为是他的新客户,在17-18财年他只购买了1次。 (即,如果有新客户,则不考虑首次购买

  4. 所有者ID: 104 ,第一次购买是在2016年,但在16-17财年又购买了3次。

代码:

CREATE TABLE Test
(
        OwnerID INT,
        ProductID VARCHAR(255),
        PurchaseDate DATE 
);

INSERT INTO Test (OwnerID, ProductID, PurchaseDate)
VALUES (101, 'P2', '2014-04-03'), (101, 'P9', '2017-08-09'),
       (101, 'P11', '2017-10-05'), (101, 'P12', '2018-01-15'),
       (102, 'P1', '2011-06-02'), (102, 'P3', '2016-06-03'),
       (102, 'P10', '2017-09-01'),
       (103, 'P8', '2017-06-23'),
       (104, 'P4', '2016-12-17'), (104, 'P5', '2016-12-18'),
       (104, 'P6', '2016-12-19'), (104, 'P7', '2016-12-20');

所需的输出:

FY16-17   FY17-18
-----------------
   5         4

我尝试了以下查询,通过获取财政年度内的计数来获取并非首次出现的记录:

SELECT * 
FROM 
    (SELECT 
         ROW_NUMBER() OVER(PARTITION BY OwnerID ORDER BY PurchaseDate) AS OCCURANCE
     FROM Test
     GROUP BY OwnerID, PurchaseDate)
WHERE 
    OCCURANCE <>  1 

但是它会引发错误:

  

第15级状态1行5的消息102
  ')'附近的语法不正确。

2 个答案:

答案 0 :(得分:1)

子查询需要具有别名-尝试以下操作:

SELECT * 
FROM 
    (SELECT 
         ROW_NUMBER() OVER(PARTITION BY OwnerID ORDER BY PurchaseDate) AS OCCURRENCE
     FROM Test
     GROUP BY OwnerID, PurchaseDate) subQry
WHERE 
    subQry.OCCURRENCE <>  1 

答案 1 :(得分:1)

我正在使用IIF来分隔两个会计年度,并使用子查询来过滤仅购买一次的会计年度

   ApiInterface apiInterface = ApiClinet.GetClinet().create(ApiInterface.class);
    Call<String> call = apiInterface.GetHome_call("x","y");
    call.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {
        }

        @Override
        public void onFailure(Call<String> call, Throwable t) {

        }
    });