如何在T-SQL中对此进行透视?
我如何得到这个:如何在T-SQL中对此进行透视?,sql,pivot,Sql,Pivot,我如何得到这个: entityid name stringvalue ----------- -------------------- -------------------- 1 ShortDescription Coal 1 LongDescription BlackCoal 1 ShortDescription Gold 1 LongDescrip
entityid name stringvalue
----------- -------------------- --------------------
1 ShortDescription Coal
1 LongDescription BlackCoal
1 ShortDescription Gold
1 LongDescription WhiteGold
1 ShortDescription Steel
1 LongDescription StainlessSteel
为此:
entityid ShortDescription LongDescription
----------- -------------------- --------------------
1 Coal BlackCoal
1 Gold WhiteGold
1 Steel StainlessSteel
到目前为止,我掌握的代码是:
select *
from (select entityid, cast(name as nvarchar(20)) as name, cast(stringvalue as nvarchar(20)) as stringvalue from metapropertyvalue) as d
pivot
(
max(stringvalue)
for [name] in ([ShortDescription],[LongDescription])
)
as p
非常感谢大家,
Matt。将表的布局放在一边,为了做你想做的事情,你不应该使用PIVOT,你需要为此使用子查询。PIVOT关键字几乎完全是用于聚合的。您可能必须通过子查询手动执行此操作
除此之外,你的桌子布局真是个糟糕的主意。我以前做过这个,我知道很多其他人以前也做过,它的伸缩性不好。最大的问题是您无法正确定义数据的索引。你应该认真考虑把表格直接换成你的“枢转”格式,因为它无论如何都是一个合适的关系样式。 假设你的dBRM不能被改变,这是在几个解决方案之后最接近的:
select TOP 1 Id
, LEFT(ShortDescription, LEN(ShortDescription) - 1) as ShortDescription
, LEFT(LongDescription, LEN(LongDescription) - 1) as LongDescription
from (
select Entity_Id as Id
, (
select StringValue + N', ' as [text()]
from MyEntities
where [Name] LIKE N'ShortDescription'
FOR XML PATH(N'')
) as ShortDescription
, (
select StringValue + N', ' as [text()]
from MyEntities
where [Name] LIKE N'LongDescription'
FOR XML PATH(N'')
) as LongDescription
from MyEntities
) e
这将导致输出:
Id |短描述|长描述1 |煤、黄金、钢铁|黑煤、白金、不锈钢 虽然我不知道你的情况,但我怀疑这是否有效
只考虑在显示数据到GUI或类似的东西之前对数据进行格式化。
顺便说一句,只有当数据由数字组成时,PIVOT工具和此类聚合才会起作用。如果您的[Name]
和StringValue
列是数字列,那么就有其他方法可以实现这个期望的结果
另一方面,我们面临着一种设计的味道
除了总是在[Name]列中提到是ShortDescription还是LongDescription之外,我建议按照您想要的数据输出方式来设计表,而不是像您那样设计表,总是要“透视”它并执行一些复杂的代码从中检索信息,如果我可以这样说的话,这是正常现象
IF OBJECT_ID(N'MyEntitiesTable') IS NOT NULL
DROP TABLE MyEntitiesTable
GO
CREATE TABLE MyEntitiesTable (
EntityId int IDENTITY(1, 1) NOT NULL PRIMARY KEY
ShortDescription nvarchar(10) NOT NULL
LongDescription nvarchar(50) NOT NULL
)
GO
insert into MyEntities (ShortDescription, LongDescription) values (N'Coal', N'BlackCoal')
GO
insert into MyEntities (ShortDescription, LongDescription) values (N'Gold', N'WhiteGold')
GO
insert into MyEntities (ShortDescription, LongDescription) values (N'Steel', N'WhiteSteel')
GO
这样,您将需要编写以下查询:
select EntityId
, ShortDescription
, LongDescription
from MyEntitiesTable
至于EntityId
字段,如果您绝对希望它始终是数字1,那么您可以在创建表时省略identity(1,1)主键。但是,我强烈建议您将其放在那里,因为这定义了主键,并且模型中的任何表都不应该没有主键
这种首选方法的原因是,对于必须添加到数据表中的每个描述,必须执行两条INSERT语句。这是对数据库事务的过度杀戮,而且,正如您当前的情况所示,很难利用它。尝试搜索“Pivot T-SQL”-在这方面有很多问题。是的,我有,但问题是我似乎没有可以在聚合函数中使用的字段。ie:我上面的评论是回应David M的评论,而不是Mitch Wheat的评论。马特,这可能会有所帮助:有什么原因导致这一结果被否决吗?如果解决方案那么简单,只需链接到它。。。