SQL Server查询,用于将每列的单个值转换为单个列

时间:2015-01-20 06:29:46

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

我将直接通过一个例子来解释。假设我有一个包含3列的表格。

enter image description here

现在我想要实现的是,我希望每个列的第一个值成为一个列。所以它会是这样的,

enter image description here

我在这里尝试了一些问题,包括使用TOP 1和其他不正确的方法。但我仍然缺少一些能够达到确切输出的东西。

在这里需要一些指导如何实现这一目标。谢谢。

5 个答案:

答案 0 :(得分:2)

样本表

SELECT * INTO #TEMP
FROM
(
    SELECT 1 BATCH_ID,'AAA' ASSIGNMENTTITLE,'FILE' ASSIGNMENTTYPE
    UNION ALL
    SELECT 1,'AAA1','FILE'
    UNION ALL
    SELECT 1,'AAA','FILE'
  )TAB

如果您需要特定的第二行,您可以执行以下操作

<强> QUERY

;WITH CTE AS
(
    -- Order row according to default format
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT(0))) RNO,*
    FROM #TEMP
)
SELECT CAST(BATCH_ID AS VARCHAR(20)) FROM CTE WHERE RNO=2
UNION ALL
SELECT ASSIGNMENTTITLE FROM CTE  WHERE RNO=2
UNION ALL
SELECT ASSIGNMENTTYPE FROM CTE  WHERE RNO=2

<强>更新

由于每条记录中有3个项目,因此可能会感到困惑,除非记录中的每个项目都有一列。

;WITH CTE AS
(
    -- Order row according to default format
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT(0))) RNO,*
    FROM #TEMP
)
SELECT CAST(BATCH_ID AS VARCHAR(20)),RNO 
FROM CTE 
UNION ALL
SELECT ASSIGNMENTTITLE,RNO  
FROM CTE  
UNION ALL
SELECT ASSIGNMENTTYPE,RNO  
FROM CTE  
ORDER BY RNO

答案 1 :(得分:0)

您可以使用concat()函数创建一个由所有所需值组成的列

More info here

答案 2 :(得分:0)

只需你可以尝试一下。如果想要特定的行使用rowid。对于所有列使用unpivot

create table #temp(id int, name varchar(100), title varchar(100))
insert into #temp values(1,'aaa','file')
insert into #temp values(1,'aaas','filef')
insert into #temp values(1,'aaaww','filefs')

select * from #temp
select top 1 cast(id as varchar) title from #temp
union
select top 1 name from #temp
union
select top 1 title from #temp

drop table #temp

答案 3 :(得分:0)

这可能对您有所帮助

select top 1 convert(varchar(10), batch_id) ASSIGNMENTTITLE from table
union all
select top 1 ASSIGNMENTTITLE  from table
union all
select top 1 ASSIGNMENTTYPE  from table

答案 4 :(得分:0)

如果这真的是你想要的:“我希望每个列的第一个值成为一个列”,它将是:

select ASSIGNMENTTITLE
from (
select min(convert(varchar(10), batch_id)) ASSIGNMENTTITLE, 
1 ColOrder from table
union all
select min(ASSIGNMENTTITLE),
2 ColOrder from table
union all
select min(ASSIGNMENTTYPE), 
3 ColOrder from table
) as data
order by ColOrder