SQL Server Несколько подсчетов даты подвыбор в том же запросе

Я пытаюсь найти способ вывести количество заказов за customer id так же как date первого и последнего заказа в диапазоне дат от Orders таблица, где каждый заказ имеет как buyer_id а также seller_id, Таблица заказов содержит OrderNumber, Buyer_ID, Seller_ID, OpenDate, ClosedDate, Я могу выполнить следующие запросы по отдельности для достижения своих целей, но я бы хотел, чтобы все было в одном запросе, если это возможно.

Order_Table:

OrderNumber, Buyer_ID, Seller_ID, OpenDate, ClosedDate

Buyer_ID Заказы:

select Buyer_ID, COUNT(*)as BuyerOrders
from
(
    select Buyer_ID
    from Orders
    where OpenDate between @StartDate and @EndDate
)
a
group by Buyer_ID

Продавец_ID Заказы:

select Seller_ID, COUNT(*)as SellerOrders
from
(
    select Seller_ID
    from Orders
    where OpenDate between @StartDate and @EndDate
)
a
group by Seller_ID

Даты первого и последнего порядка в этом диапазоне:??

Любой вклад с благодарностью!

Поскольку в результате получается объединение и один и тот же customer_id может иметь запись как покупателя, так и продавца, как я могу поместить информацию в одну строку? Моей первой попыткой было создать временную таблицу из результатов объединения, но я рисую бланк о том, как отображать BuyC Order Count, Seller Order Count и т. Д. В одной строке для каждого Customer_ID в результирующей таблице.

1 ответ

Решение
select 'Buyer' as Type, 
    Buyer_ID ID, 
    Count(*) OrderCount, 
    Min(OpenDate) FirstOrder, 
    Max(OpenDate) LastOrder
from Orders
where OpenDate between @StartDate and @EndDate
group by Buyer_ID

union

select 'Seller', 
    Seller_ID, 
    Count(*), 
    Min(OpenDate) FirstOrder, 
    Max(OpenDate) LastOrder
from Orders
where OpenDate between @StartDate and @EndDate
group by Seller_ID

[РЕДАКТИРОВАТЬ] Да, немного щеки, принимая мой ответ, затем не принимая его и меняя вопрос! В любом случае, попробуйте следующее:

;with BuyerFirst (Buyer_ID, RowNum, BuyerCount, OrderID, OpenDate)
As
(select Buyer_ID, 
    ROW_NUMBER() over (partition by Buyer_ID order by OpenDate, OrderID) as RowNum,
    count(*) over (partition by Buyer_ID) As BuyerCount, 
    OrderID, 
    OpenDate
from Orders
where OpenDate between @StartDate and @EndDate),

BuyerLast (Buyer_ID, RowNum, OrderID, OpenDate)
As
(select Buyer_ID, 
    ROW_NUMBER() over (partition by Buyer_ID order by OpenDate Desc, OrderID Desc) as RowNum,
    OrderID, 
    OpenDate
from Orders
where OpenDate between @StartDate and @EndDate),

SellerFirst (Seller_ID, RowNum, SellerCount, OrderID, OpenDate)
As
(select Seller_ID, 
    ROW_NUMBER() over (partition by Seller_ID order by OpenDate, OrderID) as RowNum,
    count(*) over (partition by Buyer_ID) As SellerCount, 
    OrderID, 
    OpenDate
from Orders
where OpenDate between @StartDate and @EndDate),

SellerLast (Seller_ID, RowNum, OrderID, OpenDate)
As
(select Seller_ID, 
    ROW_NUMBER() over (partition by Seller_ID order by OpenDate Desc, OrderID Desc) as RowNum,
    OrderID, 
    OpenDate
from Orders
where OpenDate between @StartDate and @EndDate)


select c.*, 
    bf.BuyerCount, 
    bf.OpenDate As BuyerFirstOrderDate,
    bf.OrderID As BuyerFirstOrderID, 
    bl.OpenDate As BuyerLastOrderDate, 
    bl.OrderID As BuyerLastOrderID,
    sf.SellerCount, 
    sf.OpenDate As SellerFirstOrderDate,
    sf.OrderID As SellerFirstOrderID, 
    sl.OpenDate As SellerLastOrderDate, 
    sl.OrderID As SellerLastOrderID
from Customers c
    left join BuyerFirst bf on c.CustomerID = bf.Buyer_ID and bf.RowNum = 1
    left join SellerFirst sf on c.CustomerID = sf.Seller_ID and sf.RowNum = 1
    left join BuyerLast bl on c.CustomerID = bl.Buyer_ID and bl.RowNum = 1
    left join SellerLast sl on c.CustomerID = sl.Seller_ID and sl.RowNum = 1
Другие вопросы по тегам