有一个名为Orders的表有三列:
订单ID
用户ID
订购日期
我需要知道,过去X个月,A用户下了1个订单,B个用户下了2个订单,C个用户下了3个订单等等。
因此输出是一个带有MinDate字段的表,然后是每个#从1到N的列的列,例如:
declare @t table (
MinDate datetime,
o_1 int,
o_2 int,
o_3 int,
o_4 int,
...
o_N int
)
每个字段包含在MinDate和当前日期之间放置许多订单的唯一客户(UserID)的数量。例如,如果一行有MinDate ='2009-09-01',则o_6包含在9月1日到现在之间已下达6个订单的客户数量等。
我已经尝试了几种方法,LEFT JOIN Orders到数字表等,但是在每列中获得正确的唯一用户数时遇到了问题。我可以用CURSOR轻松(慢慢地)做到这一点,但这似乎是在作弊。
有什么建议吗?如果我的解释没有意义,请告诉我......
答案 0 :(得分:1)
答案 1 :(得分:0)
这是对它的刺痛;它为我分解的部分是动态旋转(换句话说,你可以有无限范围的订单1-N)。但是,它可能会指向您(或其他人)的大方向。
DECLARE @Orders TABLE
(
OrderID INT ,
UserID INT ,
OrderDate SMALLDATETIME
)
INSERT INTO @Orders
( OrderID, UserID, OrderDate )
VALUES ( 1, 1, '20090102' ),
( 2, 1, '20090102' ),
( 3, 2, '20090102' ),
( 4, 2, '20090102' ),
( 5, 2, '20090102' ),
( 6, 3, '20090102' ),
( 7, 4, '20090102' )
SELECT *
FROM ( SELECT UserID ,
COUNT(OrderID) AS CountOrders
FROM @Orders o
WHERE OrderDate > '20090101'
GROUP BY UserID
) x PIVOT ( COUNT(UserID) FOR CountOrders IN ( [1], [2], [3], [4] ) ) AS p