我正在尝试使用我正在调用的其中一个表中的静态行值作为结果表中列名的一部分。 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
答案 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