2017-02-12 10 views
1

내가 주문 수를 당길 수있는 방법을 알아 내려고 노력하고있어 동일한 쿼리에 부속 선택customer id 당뿐만 아니라 날짜 범위 내에서 처음이자 마지막 순서 date 각 순서가있는 Orders 테이블에서 buyer_idseller_id입니다. 주문 테이블은 OrderNumber, Buyer_ID, Seller_ID, OpenDate, ClosedDate을 포함합니다. 내 목표를 달성하기 위해 다음과 같은 쿼리를 개별적으로 실행할 수 있지만 가능한 경우 모든 쿼리를 동일한 쿼리에 포함하고 싶습니다.SQL 서버 여러 카운트 날짜

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 

Seller_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에 구매자와 판매자가 모두 입력되어있을 수 있으므로 어떻게 정보를 동일한 행에 넣을 수 있습니까? 나의 첫 번째 시도는 Union의 결과로부터 임시 테이블을 만드는 것이었지만 결과 테이블의 각 Customer_ID에 대해 동일한 행에 Buyer OrderCount, Seller OrderCount 등을 표시하는 방법에 대해 공백을 표시합니다.

+0

고마워요! 여기에 내 행운을 빕니다. 그러나 고객 주문서에서 고객의 세부 정보를 이름처럼 가져 와서 실제 주문 번호를 포함 할 수있는 방법이 있습니까? Customer_Table : Customer_ID, 이름, 이메일, 전화? –

+0

결과가 합집합이고 동일한 customer_id에 구매자와 판매자가 모두 입력되어있을 수 있으므로 어떻게 정보를 동일한 행에 넣을 수 있습니까? 나의 첫 번째 시도는 Union의 결과로부터 임시 테이블을 만드는 것이었지만 결과 테이블의 각 Customer_ID에 대해 동일한 행에 Buyer OrderCount, Seller OrderCount 등을 표시하는 방법에 대해 공백을 표시합니다. –

+0

내 원래의 대답이 내 문제에 대한 매우 웅변적인 해결책이었던 Skippy에게 가장 진실한 사과. 이것은이 포럼에 게시 된 첫 번째 글이며 원래 질문을 개선하는 방법을 잘 모르고있었습니다. –

답변

0
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