Ms Access количество запросов в первую очередь - PullRequest
0 голосов
/ 13 мая 2018

У меня есть следующая таблица:

tblOrder
----------------------------
OrderID       ==>Primary Key
CustomerID    ==>Number
OrderDate     ==>Date
Order         ==>Number
Price         ==>Currency

Поле [Порядок] содержит число (например, 11, 15, 17), которое является кодом.

Я пытаюсь найти способ и, если возможно, конечно, посчитать [Заказ] на [CustomerID], что:

==>  I) Placed only [Order]=15
==> ii) Made first [Order]=15 and then placed another order which IS NOT 15.

Example Table: 
OrderID  CustomerID  OrderDate  Order  Price
--------------------------------------------
   1         3        1/1/2018    15     100
   2         2        3/2/2018    15     300
   3         2        7/3/2018    11     400
   4         3        2/6/2018    15     200
   5         1        5/2/2018    17     300
   6         1       11/7/2018    15     600
   7         2        1/4/2018    11     200

OutPut Query:
CustomerID  OnlyOrder=15  FirstOrder=15
---------------------------------------
   1           Null            Null    
   2             1               3    
   3             2             Null    

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Это намного проще, используя агрегацию и having. Следующие клиенты получают:

select customerId
from tblOrders
group by customerId
having min(iif([order] = 15, orderdate, null)) < max(iif([order] <> 15, orderdate, null)) or
       (min([order]) = 15 and max(order = 15));

Чтобы подсчитать их, используйте подзапрос:

select count(*)
from (select customerId
      from tblOrders
      group by customerId
      having min(iif([order] = 15, orderdate, null)) < max(iif([order] <> 15, orderdate, null)) or
             (min([order]) = 15 and max([order]) = 15)
     ) as c;

Edit:

Если вы хотите, чтобы first order был 15 - что не совсем так, как я интерпретирую описание - это тоже легко:

select customerId
from tblOrders
group by customerId
having min(iif([order] = 15, orderdate, null)) = min(orderdate) or
       (min([order]) = 15 and max(order = 15));

Вы можете использовать это для подсчета идентификаторов клиентов.

EDIT:

Для пересмотренного вопроса вы хотите что-то вроде этого:

select customerId,
       iif(min([order]) = 15 and max(order = 15), count(*), 0) as all_first_15,
       iif(min(iif([order] = 15, orderdate, null)) = min(orderdate) and min([order]) <> max([order]), count(*), 0) as first_order_15
from tblOrders
group by customerId
having min(iif([order] = 15, orderdate, null)) = min(orderdate) or
       (min([order]) = 15 and max(order = 15));
0 голосов
/ 13 мая 2018

Да, это довольно набор правил, но, безусловно, возможно.

Начнем с подзапроса:

Выберите всех клиентов, для которых первый заказ (заказ с наименьшим (минимальным) OrderID) равен 15:

SELECT t.CustomerID 
FROM tblOrder t 
WHERE t.Order = 15 
AND EXISTS (
    SELECT 1 
    FROM tblOrder i 
    WHERE t.CustomerID = i.CustomerID 
    HAVING Min(i.OrderID) = t.OrderID
)

Затем мы можем использовать это для подсчета всех заказов для этих пользователей:

SELECT Count(OrderID)
FROM tblOrder c
WHERE EXISTS (
    SELECT 1
    FROM tblOrder t 
    WHERE t.Order = 15 
    AND EXISTS (
        SELECT 1 
        FROM tblOrder i 
        WHERE t.CustomerID = i.CustomerID 
        HAVING Min(i.OrderID) = t.OrderID
    )
    AND t.CustomerID = c.CustomerID
)
GROUP BY c.CustomerID

Или, если вы хотите разделить счет на 15, а не на 15:

SELECT DISTINCT o.CustomerID, (SELECT COUNT(s2.OrderID) FROM tblOrder s2 WHERE s2.CustomerID = o.CustomerID AND s2.Order = 15) As Only15Count, (SELECT COUNT(s1.OrderID) FROM tblOrder s1 WHERE s1.CustomerID = o.CustomerID AND EXISTS (SELECT 1 FROM tblOrder s3 WHERE s3.CustomerID = s1.CustomerID AND s3.Order <> 15)) As TotalCount
FROM tblOrders o
WHERE EXISTS (
    SELECT 1
    FROM tblOrder t 
    WHERE t.Order = 15 
    AND EXISTS (
        SELECT 1 
        FROM tblOrder i 
        WHERE t.CustomerID = i.CustomerID 
        HAVING Min(i.OrderID) = t.OrderID
    )
    AND t.CustomerID = o.CustomerID
)

Обратите внимание, что, в отличие от ожидаемого результата, ничего не будет возвращено, если первый заказ не равен 15.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...