【问题标题】:SQL Server query for getting single value from each column into a single columnSQL Server 查询,用于将每列中的单个值转换为单个列
【发布时间】:2015-01-20 06:29:45
【问题描述】:

我会直接用一个例子来解释。假设我有一个包含 3 列的表格,如图所示。

现在我想要实现的是,我希望将每个单独列的第一个值放入一个单独的列中。所以应该是这样的,

我在这里尝试了一些查询,包括使用TOP 1 和其他不正确的方式。但是我在这里仍然缺少一些东西来实现确切的输出。

这里需要一些关于如何实现这一点的指导。谢谢。

【问题讨论】:

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


【解决方案1】:

示例表

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

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

查询

;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 个项目,除非和其他情况下,记录中的每个项目都有一个 a 列,否则可能会让人感到困惑。

;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

【讨论】:

  • 好吧,我只是设法改变了我的要求。但是,尽管如此,我会接受这个作为答案,因为如果我这样做,这会有所帮助。
【解决方案2】:

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

More info here

【讨论】:

  • 这没有帮助。不过感谢您的回答。
【解决方案3】:

你可以试试这个。如果要特定于行,请使用 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

【讨论】:

    【解决方案4】:

    这可能对你有帮助

    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
    

    【讨论】:

      【解决方案5】:

      如果这确实是您想要的:“我希望将每个单独列的第一个值放入一个单独的列中”,那就是:

      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
      

      【讨论】:

        猜你喜欢
        • 2020-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多