有没有办法重新排列选择结果列? [关闭]

Posted

技术标签:

【中文标题】有没有办法重新排列选择结果列? [关闭]【英文标题】:Is there any way to rearrange select result columns? [closed] 【发布时间】:2013-09-22 01:39:03 【问题描述】:

我想在一行中返回一名学生,这是我的选择:

select Name from student

结果:

 Name
 Emre 

我的第二个选择是我的老师,但我还是想带一排:

select Name from teacher

结果:

Name
 John 
 Adam

我想要这个输出

 Name   1.Teacher   2.Teacher
 Emre   John        Adam

是否有可能在一行中做到这一点?

【问题讨论】:

你怎么知道Emre有那些老师?你能发布你的表定义吗? 是什么连接了老师和学生? 这通常被称为透视,但如果结果的数量未知,我通常建议在报告工具或其他语言中进行而不是 SQL。有一些丑陋的方法可以实现动态枢轴,但我不是粉丝。当然,我假设一个动态的结果。如果不是动态的,如何确定 John 进入 1 列,Adam 进入 2 列? @Emre 那你怎么知道哪个学生有哪个老师?还是只是随机的?您必须有一些表格将教学与每个学生联系起来。 选择“Emre”作为姓名,“约翰”作为“1.Teacher”,“Adam”作为“2.Teacher” 【参考方案1】:

很遗憾,您没有提供有关 student 如何与每个 teacher 关联的任何详细信息,因此我假设您有一个将两者连接起来的表格,类似于以下内容:

CREATE TABLE student_teacher
    ([student_id] int, [teacher_id] int)
;

如果你有这种类型的连接表,那么你可以使用 PIVOT 函数来获取结果。如果每个学生的教师数量有限,则可以使用 row_number() 对查询进行硬编码,为每个学生的每个教师分配一个序列值:

select student_name, teacher1, teacher2
from
(
  select s.name student_name,
    t.name teacher_name,
    'teacher'
      + cast(row_number() over(partition by s.id
                                order by t.id) as varchar(10)) seq
  from student s
  inner join student_teacher st
    on s.id = st.student_id
  inner join teacher t
    on st.teacher_id = t.id
) d
pivot
(
  max(teacher_name)
  for seq in (teacher1, teacher2)
) piv;

见SQL Fiddle with Demo。但是如果你的老师数量未知,那么你会考虑使用动态 SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ', ' + QUOTENAME('teacher'
                                                       +cast(row_number() over(partition by student_id
                                                                              order by teacher_id) as varchar(10))) 
                    from student_teacher
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT student_name,' + @cols + ' 
            from 
            (
              select s.name student_name,
                t.name teacher_name,
                ''teacher''
                  + cast(row_number() over(partition by s.id
                                            order by t.id) as varchar(10)) seq
              from student s
              inner join student_teacher st
                on s.id = st.student_id
              inner join teacher t
                on st.teacher_id = t.id
            ) x
            pivot 
            (
                max(teacher_name)
                for seq in (' + @cols + ')
            ) p '

execute sp_executesql @query;

见SQL Fiddle with Demo

【讨论】:

以上是关于有没有办法重新排列选择结果列? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在关闭并再次打开时不重新创建表单的实例?

约束没有在不同的设备上排列[关闭]

POCO图片浏览器怎么关闭后会自动最小化。我重新下载安装还是那样的。请问高手有没有解决的办法

使用 SQL 按字母顺序重新排列字符串中的字符 [关闭]

内存中的高效矢量位数据“旋转”/“重新排列”[例如在 Python 中,Numpy] [关闭]

eclipse异常关闭,无法启动tomcat解决办法