本帖最后由 yijiulove 于 2011-10-10 14:36:20 编辑

解决方案 »

  1.   


    --求合計時用sum,求最大時用max
    SELECT 
    NAME,
    sum(CASE WHEN [month]=201109 THEN qty ELSE 0 END) AS '201109',
    sum(CASE WHEN [month]=201110 THEN qty ELSE 0 END) AS '201110',
    sum(CASE WHEN [month]=201111 THEN qty ELSE 0 END) AS '201111',
    ............
    FROM tablename
    GROUP BY Name
      

  2.   

    交叉表
      主键:id+lx   
      select   *   from   tab_1;显示结果如下:   
          id           lx             sj   
      ---------------------   
            1           1类       03-01-01   
            1           2类       03-01-02   
            2           1类       03-02-01   
            2           2类       03-02-02   
            2           3类       03-02-03   
            3           2类       03-03-02   select   id,max(decode(lx,'1类',sj))   1类,   
                          max(decode(lx,'2类',sj))   2类,   
                          max(decode(lx,'3类',sj))   3类   
      from   tab_1       
      group   by   id;         id               1类             2类                 3类   
           -------------------------------------------   
              1           03-01-01         03-01-02   
              2           03-02-01         03-02-02            03-02-03   
              3                            03-03-02   
                                                ..........  
      

  3.   

    这样写完全是根据数据来筛选按了,我假如month有很多个,我要列举10个月的,这样不是要写十个hard code
      

  4.   

    你月份不能固定只能使用动态SQL来
      

  5.   

    使用T-SQL行列相互转换命令:PIVOT和UNPIVOT
    一,使用PIVOT 实现数据表的列转行
    语法:
      SELECT
      <未透视的列>,
      [第一个透视列] AS <列别名>,
      [第二个透视列] AS <列别名>,
     ...
     [最后一个透视列] AS <列别名>
      FROM (
      <SELECT查询>
      ) AS <源表>
      PIVOT (
      <聚合函数>(<列>)
      FOR [<需要转换为行的列>] IN (
      [第一个透视列], [第二个透视列],
      ...
      [最后一个透视列]
      )
      ) AS <数据透视表>
      <可选的ORDER BY子句>;  以上的PIVOT子句内的第1…n个透视列的值均为需要转换为行的列的常量值,需要用[]括起,支持GUID,字符串及各种数字!二,使用UNPIVOT 实现的功能其实与PIVOT恰恰相反
    语法:
    SELECT <未逆透视的列>, [合并后的列] AS <列别名>, [行值的列名] AS <列别名> FROM ( ) AS <源表> UNPIVOT ( <行值的列名> FOR <将原来多个列合并到单个列的列名> IN ( [第一个合并列], [第二个合并列], ... [最后一个合并列] ) ) AS <数据逆透视表> <可选的ORDER BY子句>;关于PIVOT和UNPIVOT命令的使用,如果想了解更多SQL的知识可以去看看这里的文章:http://database.51cto.com/sqlserver/,绝对不会让您失望的哦.