Mam następującą tabelę, którą można również znaleźć w SQL Fiddle Tutaj :

CREATE TABLE Orders (
    Customer TEXT,
    Order_Date DATE
);

INSERT INTO Orders
(Customer, Order_Date)
VALUES 
("Customer A", "2017-05-23"),
("Customer A", "2019-01-03"),
("Customer A", "2019-02-15"),
("Customer A", "2019-02-16"),

("Customer B", "2018-09-10"),
("Customer B", "2019-01-09"),

("Customer C", "2016-09-04"),
("Customer C", "2019-02-12"),
("Customer C", "2019-02-20"),

("Customer D", "2017-03-15"),
("Customer D", "2019-02-17"),
("Customer D", "2019-02-19"),
("Customer D", "2019-02-20"),

("Customer E", "2019-02-03"),
("Customer E", "2015-10-12");

Jak widać tabelę Wyświetla daty zamówienia od różnych klientów.
.. Używam poniższego SQL, aby uzyskać unique count of orders dla klientów, że:

a) placed an order in February 2019 and
b) did not place an order in the 12 month before and
c) placed an order before this 12 months period

Odnosząc się do odpowiedzi Oto.

SELECT o.Customer,
       MAX( o.Order_Date >= '2019-02-01' AND o.Order_Date < '2019-03-01' ) as num_feb_orders
FROM ORDERS o
GROUP BY o.Customer
HAVING SUM( o.Order_Date >= '2019-02-01' AND o.Order_Date < '2019-03-01' ) > 0 AND
       SUM( o.Order_Date >= '2018-02-01' AND o.Order_Date < '2019-02-01' ) = 0 AND
       SUM( o.Order_Date < '2018-02-01' ) > 0 ;

Jak dotąd wszystko to działa dobrze.


Jednak teraz, zamiast wykonać GROUP BY na podstawie klienta, który chcę zrobić GROUP BY na podstawie Order_Date, więc wszystkie latest order_dates in February odnoszą się do klientów, które pełnią powyższe kryteria powinny być wymienionym. Rezultat powinien wyglądać tak.

Order_Date      UniqueOrders
2019-02-03            1       --> Customer E
2019-02-20            2       --> Customer C and Customer D

Co muszę zmienić w moim kodzie, aby wykonać tę pracę?

3
Michi 26 luty 2019, 11:40

2 odpowiedzi

Najlepsza odpowiedź

Możesz po prostu użyć podzapytania:

SELECT last_feb_order_date, COUNT(*) as num_customers
FROM (SELECT o.Customer,
             MAX( o.Order_Date >= '2019-02-01' AND o.Order_Date < '2019-03-01' ) as num_feb_orders,
             MAX(CASE WHEN o.Order_Date >= '2019-02-01' AND o.Order_Date < '2019-03-01' THEN o.Order_Date END) as last_feb_order_date
      FROM ORDERS o
      GROUP BY o.Customer
      HAVING SUM( o.Order_Date >= '2019-02-01' AND o.Order_Date < '2019-03-01' ) > 0 AND
             SUM( o.Order_Date >= '2018-02-01' AND o.Order_Date < '2019-02-01' ) = 0 AND
             SUM( o.Order_Date < '2018-02-01' ) > 0
     ) oc
GROUP BY last_feb_order_date
ORDER BY last_feb_order_date;
0
Gordon Linoff 26 luty 2019, 12:44

Mam nadzieję, że to pomoże, że użyłem danego zapytania jako podptańskie, aby uzyskać wymagane miejsce,

SELECT OrderDate, 
    (COUNT(*) 
     FROM (
         SELECT o.Customer, MAX(o.Order_Date) AS OrderDate,
             MAX( o.Order_Date >= '2019-02-01' AND o.Order_Date < '2019-03-01' ) AS UniqueOrders
         FROM ORDERS AS o
         GROUP BY o.Customer
        HAVING SUM( o.Order_Date >= '2019-02-01' AND o.Order_Date < '2019-03-01' ) > 0 AND
           SUM( o.Order_Date >= '2018-02-01' AND o.Order_Date < '2019-02-01' ) = 0 AND
           SUM( o.Order_Date < '2018-02-01' ) > 0)a
GROUP BY OrderDate ;
2
Arnaud Peralta 26 luty 2019, 11:10