SQL - 如何使用行值作为列名?

时间:2014-06-12 16:12:07

标签: sql db2

我正在尝试使用我正在调用的其中一个表中的静态行值作为结果表中列名的一部分。 SQL是针对DB2表编写的(它有自己挑剔的SQL细微差别和语法)。


select 
s.student_number, s.name,
r.registration_status as reg_sts || r.session_d,
r1.registration_status as reg_sts || r1.session_cd

from student_nums s, registration_status r

left join registration_status r1 on
(r.student_number = r1.student_numer
and r1.session_cd = 
(case r.session_cd when ‘fall’
Then ‘winter’
When ‘winter’
Then ‘spring’
When ‘summer’
Then ‘fall’
Else ‘ ‘
End))

Where 
s.student_number = r.student_number
And r.session_cd = &session_cd

尝试将文本与rowvalue连接以生成ColumnName失败。 (例如r.registration_status as reg_sts || r.session_d )。我可以生成一个不仅仅是我提供的文本字符串的ColumnName吗? 提示?提前谢谢。


您可以看到被调用的主注册表中的r.session_cd是单个输入变量,因此每次运行查询时都会保留一个静态值,并且二次注册表中的r1.session_cd也是从r1.session_cd值计算的静态值。我想要的结果(给出'Fall'作为输入)将是:

    Student_number  name     reg_stsFall   reg_stsWinter
    012             James    active        active
    013             Sarah    withdrawn     active

3 个答案:

答案 0 :(得分:0)

你要做的是" pivot"查询结果。

不幸的是,这个功能不在SQL标准中,并且DB2没有包含任何内置功能来简化这一功能。

可以使用标准SQL来完成,但只能使用静态列名。

对于动态列名,您需要动态构建和执行使用静态列名的语句,或者使用可以自行转动数据的报告工具。

如果这是一次性交易并且您可以访问Excel,则可以轻松地将数据提取到Excel数据透视表中。

答案 1 :(得分:0)

如果你真的需要那些专栏和列名,然后您可以在运行时动态地将查询语句构建为字符串,具体取决于您报告的会话,然后执行IMMEDIATE语句字符串。

答案 2 :(得分:0)

只要您在结果表的格式方面具有一定的灵活性,有几种方法可以将值放入适当的列中。

首先,让我们将会话进程规则放入表中,这可能会有所帮助。

    Session_Progressions

    session   next_session
    --------  ------------
    'spring'  'summer'
    'summer'  'fall'
    'fall'    'winter'
    'winter'  'spring' 

您可以创建一个简单的数据透视查询:

 select s.student_number, s.name,
        max( case when r.session_cd = 'spring'  
                    then r.registration_status
                    else null
             end )  as sts_spring,
        max( case when r.session_cd = 'summer'  
                    then r.registration_status
                    else null
             end )  as sts_summer,
        max( case when r.session_cd = 'fall'  
                    then r.registration_status
                    else null
             end )  as sts_fall,
        max( case when r.session_cd = 'winter'  
                    then r.registration_status
                    else null
             end )  as sts_winter,
   from student_nums s
   join session_progression t
         on  t.session = &session
   join registration_status r
         on  r.student_number = s.student_number
         and r.session_cd in (t.session, t.next_session)
   group by s.student_number, s.name

给予

    Student_number  name     sts_spring  sts_summer  sts_fall   sts_winter
    --------------  -------  ----------  ----------  ---------  ----------
    012             James                            active     active
    013             Sarah                            withdrawn  active

或者,您可以添加列以指示正在显示哪些会话。

现在我们可以查询:

 select s.student_number, s.name,
        r.session_cd           as curr_sessn,
        r.registration_status  as reg_sts_curr,
        r1.session_cd          as next_sessn,
        r1.registration_status as reg_sts_next
   from student_nums s
   join registration_status r
         on  r.session_cd = &session_cd
         and r.student_number = s.student_number
   join session_progression q
         on  r.session_cd = q.session       
   left join registration_status r1
         on  s.student_number = r1.student_number
         and r1.session_cd = q.next_session

给予

    Student_number  name     curr_sessn  reg_sts_curr  next_sessn  reg_sts_next
    --------------  -------  ----------  ------------  ----------  ------------
    012             James    fall        active        winter      active
    013             Sarah    fall        withdrawn     winter      active