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