给梦一个奔跑的方向!
PDF Print E-mail
User Rating: / 0
PoorBest 
Written by xlingfairy
Friday, 19 March 2010 16:44
数据表里有如下数据:
 
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 不需要引号。
 
 
 

Add comment


Security code
Refresh

Popular Contents

Recommend

Site Info

Members : 1
Content : 141
Web Links : 7
Content View Hits : 112551

Links