将列值放在行中

时间:2014-09-18 17:17:48

标签: sql sql-server sql-server-2008 sql-server-2012

我有一张表格如下:

column_name
Mark      
John      
Peter   

我想要下面的确切输出:

(No column name)    c2  c3 
Mark              John  Peter    
NULL              Mark  John 

我对此有疑问:

select case when id=11 then c1 else null end,c2,c3 from (
select  t2.column_name c1,t1.column_name c2,t3.column_name c3,
ROW_NUMBER () 
    OVER ( order by t1.column_name ) as id
 from SmartName t1 join SmartName t2 on t1.column_name <> t2.column_name
join SmartName t3
 on t2.column_name <> t3.column_name 
 ) as a
 where a.c1 <>a.c2 and a.c2<>a.c3 and a.c3 <> a.c1  
 and id in(2,11) order by c1

虽然它可以正常工作,但它排除了这个东西,我理解它是因为行计数中的ORDER BY。但有没有办法避免这种排序,同时达到相同的上述结果?

目前结果如下:

(No column name)    c2  c3
John        Peter       Mark      
NULL    John        Peter     

1 个答案:

答案 0 :(得分:0)

SQL表表示无序集,因此除非由列指定,否则它们没有排序。因此,如果没有额外的专栏,就没有一致而准确的方法来做你想做的事。

您可以告诉SQL Server您并不真正想要row_number()的排序。你可以这样做:

ROW_NUMBER () OVER ( order by (SELECT NULL) ) as id

这并不是说“不做那种”。相反,它给出了一个常量值(不幸的是,SQL Server不允许order by没有select的常量。

可以解决您的问题。无法保证row_number()枚举的行将按您所需的顺序排列。保证特定订单的 only 方法是将order by与有效列或表达式一起使用。但是,可能做你想做的事。