我在Ms SQL服务器表中有以下数据。
我想得到如下的输出。
我尝试了两组查询,但它并没有帮助我。
第一组查询给出了空值
查询
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];
输出
第二组查询给出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;
输出
如何实现它?
答案 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中没有间隙。