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

Posted

技术标签:

【中文标题】基于日期偏移量在 T-SQL 中进行透视【英文标题】:Pivoting in T-SQL based on date offset 【发布时间】:2009-10-05 22:17:13 【问题描述】:

有一个叫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 和当前日期之间下达这么多订单的唯一客户(用户 ID)的数量。例如,如果某行的 MinDate = '2009-09-01',则 o_6 包含从 9 月 1 日至今下达 6 次订单的客户数量,等等。

我尝试了几种方法,将 LEFT JOIN 订单添加到数字表等,但无法将正确的唯一用户计数添加到每列中。我可以使用 CURSOR 轻松(且缓慢)地做到这一点,但这似乎是作弊。

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

【问题讨论】:

是的,我知道如何使用 PIVOT 但不会处理此类查询 您能提供实际的查询吗? 这听起来更像是 OLAP 查询而不是 OLTP 实际查询?这就是问题的重点......我需要帮助编写查询,是的,我可以使用 MDX 来编写查询,但是(a)我仍然会遇到相同的行内计算问题,并且(b)我需要这样做这在 SQL 中 【参考方案1】:

http://www.codeproject.com/KB/database/Pivot2Columns.aspx?display=Print

【讨论】:

【参考方案2】:

这是一个尝试;对我来说,它崩溃的部分是动态旋转(换句话说,你可以有无限的订单 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

【讨论】:

是的,我什至不担心 1-N 动态 PIVOT。我知道这需要动态 SQL,所以如果它使问题更容易,假设一个有限范围 1-10 个订单。困难的部分是用户不能在一行中被重复计算,但肯定会在不同的行中被重复计算。例如,假设客户在 2009 年 7 月、8 月和 9 月下了三个订单。假设结果集包含三行,每行的 DATETIME 月份分别为 2009-07-01、2009-08-01 和 2009-09-01。对于示例客户,他将包含在 2009 年 7 月 1 日的“3”列,2009 年 8 月 1 日的“2”列和 2009 年 9 月 1 日的“1”列。 这有意义吗? (我用完了字符来解释) 这是有道理的,但除非您需要按月分组(我可能误读了您的规范),否则我看不到解决方法。我认为您需要(在 Pivot 之后)从 x 日期开始的单行数据,以显示下达 y 个订单的用户数量。你需要按日期分解吗?就像 z 客户每月有 y 个订单一样? 你能给出结果表的快照吗

以上是关于基于日期偏移量在 T-SQL 中进行透视的主要内容,如果未能解决你的问题,请参考以下文章

如何从时区名称中获取时区偏移量

计算十六进制偏移量

如何在切割 MP4 文件的一部分后确定 MP4 文件中哪些偏移量发生了变化

得到指定的偏移日期,遇到节假日就跳过,重新偏移定位日期

得到指定的偏移日期,遇到节假日就跳过,重新偏移定位日期

BigQuery 时间戳偏移量