Расчет покупок в финансовом году | SQL Server - PullRequest
0 голосов
/ 26 августа 2018

Я хотел бы узнать, какие покупки совершаются за 2 финансовых года ( 16-17 ФГ и 17-18 ФГ ).

Для этого:

  1. OwnerID: 101 , первая покупка в 2014 году с 3 покупками в 17-18 финансовом году.

  2. OwnerID: 102 , первая покупка в 2011 году с 1 покупкой в ​​16-17 финансовых годах, 1 покупкой в ​​17-18 финансовом году.

  3. OwnerID: 103 , первая покупка в 2017 году, однако не следует рассматривать , поскольку он является новым клиентом, у которого только 1 покупка в 17-18 финансовых годах. (т. е. первая покупка не учитывается, если новый клиент )

  4. OwnerID: 104 , первая покупка в 2016 году, но еще 3 покупки были совершены в 16-17 финансовых годах.

Код:

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 

Однако выдает ошибку:

Сообщение 102, Уровень 15, Состояние 1, Строка 5
Неверный синтаксис рядом с ')'.

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Я использую IIF, чтобы разделить два финансовых года, и подзапрос, чтобы отфильтровать тех, у кого была только одна покупка

SELECT SUM(IIF(PurchaseDate >= '2016-04-01' AND PurchaseDate < '2017-04-01',1,0)) AS 'FY16-17',
       SUM(IIF(PurchaseDate >= '2017-04-01' AND PurchaseDate < '2018-04-01',1,0)) AS 'FY17-18'
FROM test t1
JOIN (SELECT ownerID, COUNT(*) count 
      FROM test 
      GROUP BY ownerID) t2 on t1.ownerID = t2.ownerID
WHERE t2.count > 1
0 голосов
/ 26 августа 2018

Подзапрос должен иметь псевдоним - попробуйте это:

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...