Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.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
Sql 数据透视字段的元数据_Sql_Types_Datatable_Pivot - Fatal编程技术网

Sql 数据透视字段的元数据

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

我有一个基于复杂数据库设置的复杂问题

我有一个包含fieldId、objectId和fieldValue的表。 每个对象在此表中都有许多行—每个字段一行

示例-有名字、出生日期、体重、身高、学校等字段

对象
(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