基于日期偏移在T-SQL中进行透视

时间:2009-10-05 22:17:14

标签: sql sql-server tsql

有一个名为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轻松(慢慢地)做到这一点,但这似乎是在作弊。

有什么建议吗?如果我的解释没有意义,请告诉我......

2 个答案:

答案 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