2012-10-19 102 views
0

假设我有一个临时表创建和结构/数据看起来像这样SQL枢轴旋转柱

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}的价值和做一些与它的解释(我做了第一个的例子0)。我还想补充一点,实际上我对这些变量有大约十个。

任何想法如何旋转列?

回答

3

您可以使用类似这样:

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

+0

棒极了感谢,但是我的表结构较为复杂,则例如我给,我真的不理解查询了一下。不过,我正在修改它以使其适用于我。我将它标记为正确的答案在一点THANKs :) – masfenix

+0

可以说我想要两套支点。它,我有T列和P列,我想并排显示它们。我编辑了架构以在发送的链接中包含这些列 http://sqlfiddle.com/#!3/62862/2/0但我不知道如何编辑代码 – masfenix

+1

检查值= 0“在第二个和第三个CASE中可能是不可靠的。如果'T1','T2'等中的任何一个变成'0'会怎么样?我认为使用与第一个CASE相同的条件会更安全('subtype ='start'')。除此之外,我非常喜欢这种方法! –