疯狂的SQL问题:如何使用数据透视交叉应用?

时间:2009-11-06 23:57:42

标签: sql pivot cross-apply

客户的数据中有快捷方式,他们在某个字段中有数量的记录。当我解析它们时,我需要制作记录,每个数量一个,将“标识符”增加7天(因为数字表示日期。
例如:一个单独的产品在售四周,我需要四个记录,每周一个产品。

[活动编号] [分类] [周运行] [有些数据]
2009 11 29 00 1 1 运行一周
2009 12 06 00 2 1 运行一周
2009 12 13 00 1 4 运行四周
2009 12 20 00 2 4 运行四周

不知何故,我需要将这些数据转换为以下视图(sql select)(全部在同一个表中,包含空格以查看部分:

[事件编号+分类] [有些数据]
2009 11 29 01 运行一周一周,因此一条记录 2009 12 06 02 运行一周

2009 12 13 01 运行四周重复4次递增日期7周 2009 12 20 01 运行四周
2009 12 27 01 运行四周
2009 01 03 01 运行四周

2009 12 20 02 运行四周重复4次递增日期7周 2009 12 27 02 运行四周
2009 01 03 02 运行四周
2009 01 10 02 运行四周

我的想法是有某种数据交叉应用sql代码?

2 个答案:

答案 0 :(得分:3)

这在应用程序端而不是数据库端可能更简单,但是我会给它一个镜头......这需要一个支持CTE的数据库,我没有碰巧这是未经测试的。

WITH RECURSIVE expandedTable(eventNumber, classification, index, count, someData)
AS (
    SELECT eventNumber, classification, 1, weeksRunning, someData
    FROM originalTable
    WHERE weeksRunning > 0
  UNION ALL
    SELECT eventNumber + 7, classification, index + 1, count, someData
    FROM expandedTable
    WHERE index < count
)
SELECT eventNumber, classification, someData
FROM expandedTable;

答案 1 :(得分:2)

我有一个便宜的答案给你。您使用“预渲染”Weeks表来创建基于查询的循环。您需要花费足够的时间来覆盖预期的情景范围。

[Week]
1
2
3
4

然后,您使用不等式[Weeks Running]OriginalTable.WeeksRunning <= Weeks.Week上的查询加入此表。你最终每周排成一排。

您可以通过将Weeks.Week * 7天添加到事件编号中嵌入的日期来推断日期。