Как сравнить значение из следующего ряда? - PullRequest
2 голосов
/ 10 апреля 2019

У меня есть таблица с именем Order

   OrderID        CustomerID        IsPaid  
--------------------------------------------
    1              12                 no      
    2              12                 yes
    3              13                 no      
    4              13                 no
    5              14                 yes      
    6              14                 yes

и у меня есть таблица с именем Customer

   CustomerID      Cust_name    
--------------------------------
    12              John                       
    13              Nick                 
    14              Paul                                   

Мне нужно отобразить тех клиентов, которые оплатили заказ, но не оплатили предыдущий заказ, поэтому результат должен быть

   CustomerID      Cust_name    
--------------------------------
    12              John 

Ответы [ 5 ]

1 голос
/ 10 апреля 2019

Вы можете сделать агрегацию:

select c.CustomerID, c.Cust_name
from Customer c inner join
     Order o
     on o.CustomerID = c.CustomerID
group by c.CustomerID, c.Cust_name   
having min(o.IsPaid) <> max(o.IsPaid);
0 голосов
/ 10 апреля 2019

Вы могли бы сделать что-то вроде этого ..

SELECT t1.customerid,
       Max(cust_name) AS cust_name
FROM   table1 t1
       INNER JOIN table2 t2 using (customerid)
GROUP  BY t1.customerid
HAVING Group_concat(ispaid) = "no,yes"  

Онлайн демо: Ссылка


Структура таблицы и пример данных
CREATE TABLE Table1(
    OrderID int,
    CustomerID int,
    IsPaid varchar(03)
);

CREATE TABLE Table2(
    CustomerID int,
    Cust_name varchar(255)
);

INSERT INTO Table1
VALUES 
(1, 12, 'no'),
(2, 12, 'yes'),
(3, 13, 'no'),
(4, 13, 'no'),
(1, 14, 'yes'),
(2, 14, 'yes');

INSERT INTO Table2
VALUES  
(12, 'John'),
(13, 'Nick'),
(14, 'Paul');
0 голосов
/ 10 апреля 2019

Поскольку в вашем вопросе конкретно сказано, что «не заплатил за предыдущий заказ», здесь нужно перейти к оконным функциям!

SELECT *
FROM
(
    SELECT *,
           LAG(IsPaid) OVER (PARTITION BY CustomerID ORDER BY OrderId) AS IsPreviousOrderPaid
    FROM #Orders AS o
) ordersWithPrevious
    INNER JOIN #Customer AS c
        ON c.CustomerId = ordersWithPrevious.CustomerID
WHERE ordersWithPrevious.IsPaid = 1
      AND ordersWithPrevious.IsPreviousOrderPaid = 0;
0 голосов
/ 10 апреля 2019

Вы можете попробовать это:

SELECT   DISTINCT
         cust.CustomerID,
         cust.Cust_name
FROM     customer cust
JOIN     order    paid
  ON     cust.CustomerID = paid.CustomerID
 AND     paid.IsPaid = 'yes'
JOIN     order    unpd
  ON     cust.CustomerID = unpd.CustomerID
 AND     unpd.IsPaid = 'no'
 AND     unpd.OrderID < paid.OrderID
ORDER BY cust.CustomerID,
         cust.Cust_name;

Может быть немного дешевле сделать это следующим образом:

SELECT   DISTINCT
         cust.CustomerID,
         cust.Cust_name
FROM     customer cust
JOIN     order    paid
  ON     cust.CustomerID = paid.CustomerID
 AND     paid.IsPaid = 'yes'
WHERE    EXISTS (SELECT *
                 FROM   order unpd
                 WHERE  cust.CustomerID = unpd.CustomerID
                   AND  unpd.IsPaid = 'no'
                   AND  unpd.OrderID < paid.OrderID)
ORDER BY cust.CustomerID,
         cust.Cust_name;
0 голосов
/ 10 апреля 2019

таким образом вы получите вывод, только если существует

SELECT *
FROM   customer
       INNER JOIN order
               ON customer.customerid = order.customerid
WHERE  ispaid = 'yes';  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...