2010-04-29 4 views
2

Я относительно новый с sql, и мне нужна помощь с некоторой базовой конструкцией запроса.SQL: Нужна помощь в построении запроса

Задача: Извлечь количество заказов и идентификатор клиента из таблицы на основе набора параметров.

Я хочу написать запрос, чтобы выяснить количество заказов по каждому клиенту (столбец: Customerid) вместе с идентификатором CustomerID, где количество заказов должно быть больше или равно 10, а статус заказа должен быть активным , Более того, я также хочу знать первую дату транзакции заказа, принадлежащего каждому клиенту.

Таблица Описание:

product_orders

Orderid CustomerId Transaction_date Status 
------- ---------- ---------------- ------- 
1  23   2-2-10   Active 
2  22   2-3-10   Active 
3  23   2-3-10   Deleted 
4  23   2-3-10   Active 

запросов, что я написал:

select count(*), customerid 
    from product_orders 
where status = 'Active' 
GROUP BY customerid 
ORDER BY customerid; 

Данное заявление дает мне

  • сумма всего заказа по заказу клиента id, но не соответствует условиям из 10 заказов.
  • Я знаю, как выигрыш , чтобы отобразить первую дату транзакции вместе с заказом под CUSTOMERID (статус: может быть активным или delelted не имеет значения)

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

Total Orders CustomerID Transaction Date (the first transaction date) 
------------ ---------- ---------------- 
11   23   1-2-10 

Заранее спасибо. Надеюсь, вы, ребята, будете любезны, чтобы зайти и помочь мне.

Приветствия,

Леонидас

ответ

1
SELECT 
    COUNT(*) AS [Total Orders], 
    CustomerID, 
    MIN(Transaction_date) AS [Transaction Date] 
FROM product_orders 
WHERE product_orders.Status = 'Active' 
GROUP BY 
    CustomerId 
HAVING COUNT(*) >= 10 
+0

спасибо Даниэль :) – Geeknidas

1

HAVING позволит фильтровать агрегаты, как COUNT() & MIN() покажет первую дату.

select 
    count(*), 
    customerid, 
    MIN(order_date) 
from product_orders 
    where status = 'Active' 
    GROUP BY customerid 
    HAVING COUNT(*) >= 10 
    ORDER BY customerid 

Если вы хотите самую раннюю дату, независимо от статуса вы можете подзапрос для этого

select 
    count(*), 
    customerid, 
    (SELECT min(order_date) FROM product_orders WHERE product_orders.customerid = p.customerid) AS FirstDate 
from product_orders P 
    where status = 'Active' 
    GROUP BY customerid 
    HAVING COUNT(*) >= 10 
    ORDER BY customerid 
+0

ли не подзапросы в списке полей медленных? Я видел запрос, который работает примерно на 180 секунд на Oracle из-за таких подзапросов. Повторный запрос, чтобы одни и те же данные ('FirstDate' в моем примере) извлекались из« псевдо-просмотра »(т., подзапрос, который используется как источник данных; не уверен, как это называется), который «присоединяется» к другим источникам данных, восстанавливал время до 0,1, 0,2 секунды. – binaryLV

0

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

Select Count(OrderId) as TotalOrders, 
     CustomerId, 
     Min(Transaction_Date) as FirstActiveOrder 

From Product_Orders 
Where [Status] = 'Active' 
Group By CustomerId 
Having Count(OrderId)>10 
0
select count(*), customerid, MIN(Transaction_date) from product_orders 
    where status = 'Active' 
    GROUP BY customerid having count(*) >= 10 
    ORDER BY customerid 
Смежные вопросы