如何根据另一列中的值将列拆分为两列

时间:2018-02-02 13:26:46

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

我在Ms SQL服务器表中有以下数据。

enter image description here

我想得到如下的输出。

enter image description here

我尝试了两组查询,但它并没有帮助我。

第一组查询给出了空值

查询

SELECT 
    [id]
  , [sav]
  , [cat]
  , [tech]
  , [asset]
  , CASE
        WHEN [objname] = 'FieldName'
        THEN [stringvalue]
    END AS [fieldname]
  , CASE
        WHEN [objname] = 'FieldValue'
        THEN [stringvalue]
    END AS [fieldvalue]
FROM [test].[dbo].[sample];  

输出

enter image description here

第二组查询给出0作为字段值,因为我已对其进行了硬编码。

查询

SELECT 
    ROW_NUMBER() OVER(ORDER BY [fieldname]) AS 'id'
  , [sav]
  , [cat]
  , [tech]
  , [asset]
  , [fieldname]
  , 0 AS [fieldvalue]
FROM [test].[dbo].[sample] PIVOT(MAX([stringvalue]) FOR [objname] IN(
    [fieldname])) [p]
WHERE [fieldname] IS NOT NULL;

输出

enter image description here

如何实现它?

1 个答案:

答案 0 :(得分:2)

你有一个非常神秘的数据结构。 SQL表本质上是无序的。据我所知,SQL值是基于id的“下一行”。

如果是,您可以使用lead()

select . . .,
       stringvalue as fieldname, next_string_value as stringvalue
from (select t.*, lead(t.stringvalue) over (order by id) as next_string_value
      from t
     ) t
where t.objname = 'objname';

如果您确实在使用SQL Server 2008,则可以使用自联接。这确实假设id中没有间隙。