数据表里有如下数据:
RetailerID Products Count CreatedOn
9 2241 2009-09-07 00:00:00.000
9 2285 2009-09-14 00:00:00.000
9 2295 2009-09-21 00:00:00.000
9 2353 2009-09-28 00:00:00.000
9 2335 2009-10-05 00:00:00.000
9 2355 2009-10-12 00:00:00.000
9 2344 2009-10-19 00:00:00.000
9 2367 2009-10-26 00:00:00.000
9 2370 2009-11-02 00:00:00.000
10 283 2009-04-13 00:00:00.000
10 283 2009-04-20 00:00:00.000
10 283 2009-04-27 00:00:00.000
...
...
要输出为如下的格式:
RetailerID 2009-11-02 2009-10-26 2009-10-19 2009-10-12
9 2370 2367 2344 2355
10 335 334 334 334
11 15329 15251 15382 14866
12 9716 9716 9716 9716
13 2793 2724 2627 2500
14 37357 37357 37357 18928
15 1290 1289 1290 1292
16 61 61 61 61
17 12484 12454 12552 12599
怎么办呢?用程序输出是件很麻烦的事,而且最终输出的字段数目不固定。
SQLServer (2005 ?)提供了 PIVOT 和 UNPIVOT 语法,具体可参见SQLServer联机丛书。
SELECT
RetailerID , [2010-02-26],[2010-03-05],[2010-03-12],[2010-03-19] -- 注1
FROM
(
SELECT
RetailerID,
ProductsCount,
CreatedOn
FROM
CSK_Store_Retailer_Change_Rate
WHERE
CreatedOn IN ('2010-02-26','2010-03-05','2010-03-12','2010-03-19') -- 注2
) P
PIVOT (
SUM(ProductsCount) --注3
FOR CreatedOn IN ([2010-02-26],[2010-03-05],[2010-03-12],[2010-03-19]) -- 注4
) AS PVT
注1:
这里的 [2010-02-26],[2010-03-05],[2010-03-12],[2010-03-19] 是 注4 中所标出来的字段。
注2:
这个 SELECT 是要进行行列转换的 原数据。
注3:
要显示的数据(RetailerID 可以认为是行头, 日期可以认为是列头)
这里必须是集合函数,反正每天,每个 RetailerID 只有一条数据,所以是 SUM 还是 AVG 都无所谓。
注4:
FOR
[<column that contains the values that will become column headers>]
IN ( [first pivoted column], [second pivoted column],
... [last pivoted column])
这几句不好翻译,大概就是 这个 FOR 所指的 column 将成为列头。
注1 中出现的那几个必须出现在 注4 中。
另外注意:
注2 是条件,注1和注4是字段,所以,注1,4 不需要引号。
| < Prev | Next > |
|---|



