Sql 数据透视字段的元数据
我有一个基于复杂数据库设置的复杂问题 我有一个包含fieldId、objectId和fieldValue的表。 每个对象在此表中都有许多行—每个字段一行 示例-有名字、出生日期、体重、身高、学校等字段 对象Sql 数据透视字段的元数据,sql,types,datatable,pivot,Sql,Types,Datatable,Pivot,我有一个基于复杂数据库设置的复杂问题 我有一个包含fieldId、objectId和fieldValue的表。 每个对象在此表中都有许多行—每个字段一行 示例-有名字、出生日期、体重、身高、学校等字段 对象(id:1)可以有以下行: 1.1.'john' 1.2.'march-31-2000' 1.3.155 1.4.60 1.5.'ps 176' 我有一个网格,每个字段显示一列,每个对象显示一行- 列名将是名字、出生日期、体重、身高、学校 我的数据库中的所有对象都有行 我使用了一个pivot
(id:1)
可以有以下行:
1.1.'john'
1.2.'march-31-2000'
1.3.155
1.4.60
1.5.'ps 176'
我有一个网格,每个字段显示一列,每个对象显示一行-
列名将是名字、出生日期、体重、身高、学校
我的数据库中的所有对象都有行
我使用了一个pivot来获取这些数据-
差不多-
SELECT *
FROM #temp123
PIVOT (
MAX(fieldValue)
FOR [Variable] IN ([firstName],[dob],[weight],[height],[school])
) AS p
这对于显示数据很有效。然而,现在是将排序添加到我的网格中的时候了。我希望int列像int一样排序(101>99),date列像date一样显示(1/1/2016>12/31/2015)
我怎样才能做到这一点
谢谢 这可能是您的解决方案:
CREATE TABLE #EntityAttributValue (entityID INT, Attribute VARCHAR(100),Value VARCHAR(100));
INSERT INTO #EntityAttributValue VALUES
(1,'BirthDate','2000-04-01')
,(1,'Size','1.72')
,(1,'FirstName','John')
,(1,'LastName','Doe')
,(2,'BirthDate','1990-04-01')
,(2,'Size','1.81')
,(2,'FirstName','Jane')
,(2,'LastName','Miller')
,(3,'BirthDate','1980-05-01')
,(3,'FirstName','Hugo')
,(3,'LastName','Boss');
DECLARE @columns VARCHAR(MAX)=
(
SELECT STUFF(
(
SELECT DISTINCT ',[' + Attribute + ']'
FROM #EntityAttributValue
FOR XML PATH('')
),1,1,'')
);
DECLARE @query VARCHAR(MAX)=
'SELECT p.*
FROM
(
SELECT *
FROM #EntityAttributValue
) AS tbl
PIVOT
(
MIN(Value) FOR Attribute IN(' + @columns + ')
) AS p';
--The column's list might be generated from metadata (dictionary attrib/type)
DECLARE @Wrapped VARCHAR(MAX)=
';WITH MyCTE AS (' + @query + ')
SELECT entityID
,CAST(BirthDate AS DATE) AS BirthDate
,FirstName
,LastName
,CAST(Size AS FLOAT) AS Size
FROM MyCTE';
EXEC (@Wrapped);
GO
DROP TABLE #EntityAttributValue;
这是前一个答案
名称-值对(或实体-属性-值表[EAV])通常是不应该做的。。。这里有一篇文章(你会发现更多!)描述了原因:
如果您必须坚持这种设计,有一种解决方案使用CASE
和groupby
,但您必须确保正确地铸造您的值(尤其要注意日期时间值!):
也许你必须更好地解释那些只出现在问题末尾的INT和DATE字段,它们与其他所有内容都没有关联。你能解释清楚吗?亲爱的StackOverflow,您的社区由一些知识渊博、乐于助人的程序员组成,如下面引用的Shnugo,不幸的是,一些知识不太渊博、无聊的ppl,他们喜欢用不相关的负面评论破坏许多问题。我发布了一个非常清晰的问题,附有示例和细节,知识渊博的程序员能够给我很多帮助。见下文。后一类程序员只是试图给出不相关的负面反馈。例如,“也许你必须更好地解释那些INT和DATE字段”。事实上,ints和date字段已经过详细说明。你想让我解释为什么学生A重250磅,学生B重125磅。你想让我加上学生A比学生B吃得多的细节吗?我开始觉得这些无关的评论幼稚可笑。我认为你应该对他们做点什么。在这里不必粗鲁。我们都是来帮忙的,永远记住这一点。你的问题被五个人解决了,他们读了之后觉得很难理解。这可以用你的观点来解释。在这里,我们并不认为一个人有没有经验。我们只是想确定数据,以便我们能够提供准确的答案。至于你的“我发布了一个非常清晰的问题”,这里有一个好的、格式良好的SQL问题的例子:如果你仍然觉得我们在结束你的问题时错了,你可以在。。。您可以提出投诉。我理解您对标准查询的评论,但我不知道如何在pivot中执行此操作-从#temp123 pivot(MAX(fieldValue)-此处的案例陈述不适用于([firstName]、[dob]、[weight]、[height]、[school])中的[Variable]p@thewhiz不这不是透视图,透视图将不允许您键入此内容。可能有机会包装您的完整查询(CTE或sub-select),并在最外层的
select
中键入完整列列表,然后在那里进行转换…哦,我明白了。我动态生成这个查询,我可以有很多列。你知道pivot是否比这更有效吗?反之亦然?我当然喜欢干净的pivot语法,但也许我需要这种方法take@thewhiz,据我所知,这种“老式轴心”的性能更好。。。如果这能解决您的问题,请在投票柜台下方的接受检查处打勾,谢谢!谢谢我会这么做,但你能再澄清一件事吗?如果我想坚持使用老式的pivot以获得更好的性能,我是否应该得到一个fieldID-fieldType字典,对于非文本的字段,然后转换列?
DECLARE @EntityAttributValue TABLE(entityID INT, Attribute VARCHAR(100),Value VARCHAR(100));
INSERT INTO @EntityAttributValue VALUES
(1,'BirthDate','2000-04-01')
,(1,'Size','1.72')
,(1,'FirstName','John')
,(1,'LastName','Doe')
,(2,'BirthDate','1990-04-01')
,(2,'Size','1.81')
,(2,'FirstName','Jane')
,(2,'LastName','Miller')
,(3,'BirthDate','1980-05-01')
,(3,'FirstName','Hugo')
,(3,'LastName','Boss');
SELECT eav.entityID
,MAX(CASE WHEN eav.Attribute='FirstName' THEN eav.Value ELSE NULL END) AS FirstName
,MAX(CASE WHEN eav.Attribute='LastName' THEN eav.Value ELSE NULL END) AS LastName
,MAX(CASE WHEN eav.Attribute='BirthDate' THEN CAST(eav.Value AS DATE) ELSE NULL END) AS Birtdate
,MAX(CASE WHEN eav.Attribute='Size' THEN CAST(eav.Value AS FLOAT) ELSE NULL END) AS Size
FROM @EntityAttributValue AS eav
GROUP BY eav.entityID