none
行列转换的问题 RRS feed

  • 问题

  • 大家好!

    这里有这么一个表,需要进行行列转换操作,一时没有好的思路除了用静态方法硬写,请问有好的办法吗? 大概是48列,下面是摘录的部分数据

    Region Brand 未结订单销售额 书面订单销售额 书面计划销售额 书面计划达成率 书面去年同期销售额 书面增减比例 各品牌书面销售占比 完结订单销售额
    1 A 111111 1234 0 100% 39618.04 295% 1% 204238.8
    1 B 222222 321 0 100% 106686524.2 -77% 99% 54581525
    1 C 33333 23 0 100% 0 100% 0% 17489
    1 D 444444 444 0 100% 0 100% 0% 36070
    2 A 555555 231 0 100% 0 100% 1% 0
    2 B 5556666 4356 211376500 3% 8095643.45 -11% 99% 858530.8
    2 C 77777 1342266 0 100% 0 100% 0% 309
    2 D 88888 54365 0 100% 0 100% 0% 0
    3 A 444444 34134 0 100% 643403.46 62% 0% 1192275
    3 B 444444 5245 560532500 67% 406411145.9 -7% 100% 2.84E+08
    3 C 444444 13446 0 100% 0 100% 0% 60275
    3 D 444444 5748345 0 100% 0 100% 0% 204506.6
    4 A 444444 135346435 0 100% 1628797.12 183% 0% 3681425
    4 B 444444 234647 1462856000 91% 1199848605 11% 100% 9.7E+08
    4 C 444444 247345 0 100% 0 100% 0% 260826.3
    4 D 444444 24637356 0 100% 0 100% 0% 375010.1
    1 E 444444 2343753 0 100% 106726142.3 -76% 100% 54839322
    2 E 444444 243457457 211376500 3% 8095643.45 -10% 100% 858839.8
    3 E 444444 454684 560532500 68% 407054549.3 -7% 100% 2.86E+08
    4 E 444444 1335954243 1462856000 91% 1201477402 11% 100% 9.75E+08

    转换后的数据类似:

    科目 A-1 A-2 A-3 A-4 B-1 B-2 B-3 B-4 ...

    未结订单销售额

    书面订单销售额

    书面计划销售额

    ...

    • 已编辑 lovessd 2013年9月2日 12:10 添加信息
    2013年9月2日 12:07

答案

  • 您好,
    可以使用Pivot + union all 來串接,如下,

    USE tempdb
    GO
    --DROP TABLE #t1
    
    CREATE TABLE #t1
    (
    Region INT,
    Brand VARCHAR(5),
    未结订单销售额 MONEY,
    书面订单销售额 MONEY,
    书面计划销售额 MONEY,
    书面计划达成率 INT,
    书面去年同期销售额 MONEY,
    书面增减比例 INT,
    各品牌书面销售占比 INT,
    完结订单销售额 MONEY 
    );
    
    INSERT INTO #t1
            ( Region ,
              Brand ,
              未结订单销售额 ,
              书面订单销售额 ,
              书面计划销售额 ,
              书面计划达成率 ,
              书面去年同期销售额 ,
              书面增减比例 ,
              各品牌书面销售占比 ,
              完结订单销售额
            )
    VALUES  ( 1 , -- Region - int
              'A' , -- Brand - varchar(5)
              111111 , -- 未结订单销售额 - money
              1234 , -- 书面订单销售额 - money
              0 , -- 书面计划销售额 - money
              100 , -- 书面计划达成率 - int
              39618.04 , -- 书面去年同期销售额 - money
              295 , -- 书面增减比例 - int
              1 , -- 各品牌书面销售占比 - int
              204238.8  -- 完结订单销售额 - money
            );
    
    INSERT INTO #t1
            ( Region ,
              Brand ,
              未结订单销售额 ,
              书面订单销售额 ,
              书面计划销售额 ,
              书面计划达成率 ,
              书面去年同期销售额 ,
              书面增减比例 ,
              各品牌书面销售占比 ,
              完结订单销售额
            )
    VALUES  ( 1 , -- Region - int
              'B' , -- Brand - varchar(5)
              222222 , -- 未结订单销售额 - money
              321 , -- 书面订单销售额 - money
              0 , -- 书面计划销售额 - money
              100 , -- 书面计划达成率 - int
              106686524.2 , -- 书面去年同期销售额 - money
              -77 , -- 书面增减比例 - int
              99 , -- 各品牌书面销售占比 - int
              54581525  -- 完结订单销售额 - money
            );
    
     
    SELECT  N'未结订单销售额' AS [科目], *
    FROM    ( SELECT Brand + '-' + LTRIM(STR(Region)) AS BR
    , [未结订单销售额] 
    FROM #t1
            ) AS SourceTable PIVOT
    	( SUM([未结订单销售额]) FOR [BR] IN ( [A-1], [B-1] ) ) AS [V1]
    UNION ALL 
    SELECT  N'书面订单销售额' AS [科目], *
    FROM    ( SELECT Brand + '-' + LTRIM(STR(Region)) AS BR
    , [书面订单销售额] 
    FROM #t1
            ) AS SourceTable PIVOT
    	( SUM([书面订单销售额]) FOR [BR] IN ( [A-1], [B-1] ) ) AS [V2]

    如果要動態的話,就使用Exec去包查詢的Script,

    http://www.dotblogs.com.tw/rainmaker/archive/2012/05/28/72431.aspx


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    • 已编辑 亂馬客 2013年9月3日 7:11 add link
    • 已标记为答案 lovessd 2013年9月4日 4:04
    2013年9月3日 7:10

全部回复

  • Pivot中进行行列转换需要有个<非樞紐資料行>,我这边的情况比范例更为复杂,

    要将标题的行全部转成第一列,而且这里也没有所谓的非樞紐資料行。

    请问怎么操作?

    2013年9月2日 13:31
  • 您好,
    可以使用Pivot + union all 來串接,如下,

    USE tempdb
    GO
    --DROP TABLE #t1
    
    CREATE TABLE #t1
    (
    Region INT,
    Brand VARCHAR(5),
    未结订单销售额 MONEY,
    书面订单销售额 MONEY,
    书面计划销售额 MONEY,
    书面计划达成率 INT,
    书面去年同期销售额 MONEY,
    书面增减比例 INT,
    各品牌书面销售占比 INT,
    完结订单销售额 MONEY 
    );
    
    INSERT INTO #t1
            ( Region ,
              Brand ,
              未结订单销售额 ,
              书面订单销售额 ,
              书面计划销售额 ,
              书面计划达成率 ,
              书面去年同期销售额 ,
              书面增减比例 ,
              各品牌书面销售占比 ,
              完结订单销售额
            )
    VALUES  ( 1 , -- Region - int
              'A' , -- Brand - varchar(5)
              111111 , -- 未结订单销售额 - money
              1234 , -- 书面订单销售额 - money
              0 , -- 书面计划销售额 - money
              100 , -- 书面计划达成率 - int
              39618.04 , -- 书面去年同期销售额 - money
              295 , -- 书面增减比例 - int
              1 , -- 各品牌书面销售占比 - int
              204238.8  -- 完结订单销售额 - money
            );
    
    INSERT INTO #t1
            ( Region ,
              Brand ,
              未结订单销售额 ,
              书面订单销售额 ,
              书面计划销售额 ,
              书面计划达成率 ,
              书面去年同期销售额 ,
              书面增减比例 ,
              各品牌书面销售占比 ,
              完结订单销售额
            )
    VALUES  ( 1 , -- Region - int
              'B' , -- Brand - varchar(5)
              222222 , -- 未结订单销售额 - money
              321 , -- 书面订单销售额 - money
              0 , -- 书面计划销售额 - money
              100 , -- 书面计划达成率 - int
              106686524.2 , -- 书面去年同期销售额 - money
              -77 , -- 书面增减比例 - int
              99 , -- 各品牌书面销售占比 - int
              54581525  -- 完结订单销售额 - money
            );
    
     
    SELECT  N'未结订单销售额' AS [科目], *
    FROM    ( SELECT Brand + '-' + LTRIM(STR(Region)) AS BR
    , [未结订单销售额] 
    FROM #t1
            ) AS SourceTable PIVOT
    	( SUM([未结订单销售额]) FOR [BR] IN ( [A-1], [B-1] ) ) AS [V1]
    UNION ALL 
    SELECT  N'书面订单销售额' AS [科目], *
    FROM    ( SELECT Brand + '-' + LTRIM(STR(Region)) AS BR
    , [书面订单销售额] 
    FROM #t1
            ) AS SourceTable PIVOT
    	( SUM([书面订单销售额]) FOR [BR] IN ( [A-1], [B-1] ) ) AS [V2]

    如果要動態的話,就使用Exec去包查詢的Script,

    http://www.dotblogs.com.tw/rainmaker/archive/2012/05/28/72431.aspx


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    • 已编辑 亂馬客 2013年9月3日 7:11 add link
    • 已标记为答案 lovessd 2013年9月4日 4:04
    2013年9月3日 7:10
  • 非常感谢乱马客,我的问题迎刃而解!
    • 已编辑 lovessd 2013年9月5日 10:07 输入错误
    2013年9月4日 4:05