【问题标题】:SQL Pivoting a columnSQL 透视列
【发布时间】:2012-10-19 19:17:07
【问题描述】:

假设我创建了一个临时表并且结构/数据看起来像这样

  Type        Lang    N_cnt        Pcnt      T1      T2       T3      T4
============================================================================
ClassroomA      1      165897      1232     6439    1135     4516     1756
ClassroomA      2      175127      1254     6439    1135     1285     1953
ClassroomB      1      179515      1284     6439    1762     3945     1957
ClassroomB      2      159683      2041     6439    1575     4745     1955

我想旋转 T1T2T3T4 列,以便得到这个结果

   Type       SubType   Lang      N_cnt            P_cnt   
==============================================================
ClassroomA      NULL     1       165897          1232  
NULL            "T1"     1   6439/165897     6439/1232       
NULL            "T2"     1       *calculation*   *calculation*
NULL            "T3"     1       *calculation*   *calculation*
NULL            "T4"     1       *calculation*   *calculation*
ClassroomA      NULL     2       175127          1254  
NULL            "T1"     2       6439/175127     6439/1254       
NULL            "T2"     2       *calculation*   *calculation*
NULL            "T3"     2       *calculation*   *calculation*
NULL            "T4"     2       *calculation*   *calculation*

请注意,在上面写着calculation 的地方,我将取T{x} 的值并对其进行一些计算(我为第一个T1 做了一个示例)。我还想补充一点,实际上我有大约十个以上这些T 变量。

任何想法如何旋转列?

【问题讨论】:

    标签: sql-server tsql pivot unpivot


    【解决方案1】:

    你可以使用类似这样的东西:

    select type, 
      case when subtype = 'start' then null else subtype end subtype,
      lang, 
      case when subtype = 'start' then n_cnt else value/(n_cnt * 1.0) end n_cnt,
      case when subtype = 'start' then pcnt else value/(pcnt * 1.0) end pcnt
    from
    (
      select type, lang, n_cnt, pcnt, 
        T1, T2, T3, T4, 0 as start
      from table1
    ) x
    unpivot 
    (
      value 
      for subtype in (T1, T2, T3, T4, start)
    ) un
    order by type, lang, subtype;
    

    SQL Fiddle with Demo

    【讨论】:

    • 非常感谢,但是我的表结构比我给出的示例要复杂一些,而且我不太了解查询。但是,我正在努力对其进行修改以使其适合我。稍后我会将其标记为正确答案谢谢:)
    • 假设我想要两组枢轴。它,我有 T 列和 P 列,我想并排显示它们。我已编辑架构以将这些列包含在您发送的链接中 sqlfiddle.com/#!3/62862/2/0 但我不知道如何编辑代码
    • 在第二个和第三个 CASE 中检查 value = 0 可能不可靠。如果T1T2 等中的任何一个结果是0 怎么办?我认为使用与第一个 CASE (subtype = 'start') 相同的条件会更安全。除此之外,我真的很喜欢这种方法!
    • @masfenix 您只需将字段添加到查询的unpivot 部分——参见这个小提琴——sqlfiddle.com/#!3/62862/13
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多