Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在T-SQL中对此进行透视?_Sql_Pivot - Fatal编程技术网

如何在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的评论。马特,这可能会有所帮助:有什么原因导致这一结果被否决吗?如果解决方案那么简单,只需链接到它。。。