基于日期偏移量在 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 中进行透视的主要内容,如果未能解决你的问题,请参考以下文章