繁体   English   中英

根据日期偏移量在T-SQL中进行透视

[英]Pivoting in T-SQL based on date offset

有一个名为Orders的表,该表具有三列:

  • 订单编号

  • 用户身份

  • 订购日期

我需要知道,过去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移至数字表等,但是在将正确的唯一用户数计入每一列时遇到了麻烦。 我可以用游标轻松(缓慢地)执行此操作,但这似乎是作弊。

有什么建议么? 如果我的解释没有道理,请告诉我...

这是一个刺。 它对我来说最重要的部分是动态旋转(换句话说,您可以具有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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM