Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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/0/xml/15.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 如何在postgres中使用表中作为列保存的水平数据_Sql_Group By_Amazon Redshift_Entity Attribute Value - Fatal编程技术网

Sql 如何在postgres中使用表中作为列保存的水平数据

Sql 如何在postgres中使用表中作为列保存的水平数据,sql,group-by,amazon-redshift,entity-attribute-value,Sql,Group By,Amazon Redshift,Entity Attribute Value,我有一张这样的桌子: 表VR ID Key Value Date 123 First_Name Vlad 01-01-2011 234 First_Name Jim 07-01-2011 456 First_Name Olimpia 10-02-2012 123 Last_Name Kofman 12-02-2014 234 Last_Name Cramer 14-02-2014 456 Last_Name Dukakis 04-03-2

我有一张这样的桌子:

表VR

ID  Key         Value   Date
123 First_Name  Vlad    01-01-2011
234 First_Name  Jim     07-01-2011
456 First_Name  Olimpia 10-02-2012
123 Last_Name   Kofman  12-02-2014
234 Last_Name   Cramer  14-02-2014
456 Last_Name   Dukakis 04-03-2015
123 Dept    IT          08-03-2016
234 Dept    Marketing
456 Dept    Accounting
123 Sex M
234 Sex M
456 Sex F
现在,我想编写一个查询来获取First_Name='Vlad'和Last_Name='Cramer'所在的值。 另一种情况是我想获取日期“2011年1月1日”到“2016年2月14日”之间的所有记录

我写的查询是:

SELECT VR.key,
      Min(( CASE
              WHEN ( VR.key = 'FIRST_NAME' ) THEN
             VR.value
              ELSE 'n/a'
            END )) AS first_name,
      Min(( CASE
              When ( VR.key = 'LAST_NAME' ) THEN
              VR.value
              ELSE 'n/a'
            END )) AS last_name
FROM   VR
WHERE   ( ( VR.first_name = 'Vlad' )
          AND ( VR.last_name = 'Cramer' ) )
GROUP  BY VR.key
ORDER  BY VR.first_name,
VR.last_name
我得到的例外是Amazon]500310无效操作:列VR.first\U name不存在


任何人都可以帮助我获得想要的结果。

您的表没有名为first\u name或last\u name的列-这些是键列中的值

我认为您实际上是在寻找条件聚合:

select id
from vr
where key in ('First_Name', 'Last_Name')
group by id
having 
    max(case when key = 'First_Name' and value = 'Vlad' then 1 end) = 1
    and max(case when key = 'Last_Name' and value = 'Cramer' then 1 end) = 1

这将为您提供名为Vlad、姓为Cramer的ID。

您的表没有名为first\u name或last\u name的列-这些是键列中的值

我认为您实际上是在寻找条件聚合:

select id
from vr
where key in ('First_Name', 'Last_Name')
group by id
having 
    max(case when key = 'First_Name' and value = 'Vlad' then 1 end) = 1
    and max(case when key = 'Last_Name' and value = 'Cramer' then 1 end) = 1

这将为您提供名为Vlad、姓为Cramer的ID。

您应该从VR表中构建一个常规表,并将其用作从该内部选择进行查询或构建视图的起点

SELECT 
    *
FROM
    (SELECT 
        VR.id,
            MAX(IF(VR.key = 'First_Name', VR.Value, NULL)) 'First_Name',
            MAX(IF(VR.key = 'Last_Name', VR.Value, NULL)) 'Last_Name',
            MAX(IF(VR.key = 'Dept', VR.Value, NULL)) 'Dept',
            MAX(IF(VR.key = 'Sex M', 'male', IF(VR.key = 'Sex F', 'female', NULL))) 'Gender'
    FROM
        VR
    GROUP BY VR.id) comp
WHERE
    First_Name = 'Vlad'
        AND Last_Name = 'Kofman';

dbfiddle

您应该从您的VR表中构建一个常规表,并将其用作从该内部SELECT进行查询或构建视图的起点

SELECT 
    *
FROM
    (SELECT 
        VR.id,
            MAX(IF(VR.key = 'First_Name', VR.Value, NULL)) 'First_Name',
            MAX(IF(VR.key = 'Last_Name', VR.Value, NULL)) 'Last_Name',
            MAX(IF(VR.key = 'Dept', VR.Value, NULL)) 'Dept',
            MAX(IF(VR.key = 'Sex M', 'male', IF(VR.key = 'Sex F', 'female', NULL))) 'Gender'
    FROM
        VR
    GROUP BY VR.id) comp
WHERE
    First_Name = 'Vlad'
        AND Last_Name = 'Kofman';

dbfiddle

请只标记您正在使用的一个数据库,因为您同时拥有mysql和postgres,这是两个不同的数据库。从错误消息中,看起来您实际上正在运行amazon redshift-此数据库有一个特定的标记。编辑该标记以喜欢编写SQL来在EAV模型中处理数据。。。期望的结果到底是什么样的?我们期望得到什么回报?这些属性行是否由id列链接。。。我们是否应该把它看成是像123、'Vlad','Kofman','M','IT',这样的元组行,。。。和234、‘吉姆’、‘克莱默’、‘M’、‘营销’、,。。。456、‘奥林匹亚’、‘杜卡基斯’、‘F’、‘会计’、,。。。然后写一个会返回什么的查询?考虑到坏sql作为规范,我们只是猜测…@spencer7593为了您的理解,我修改了我的问题,实际上我需要获取日期范围为'01-01-2011'到'14-02-2016'之间的所有记录,它与名字和姓氏无关。你能帮我查询一下吗?现在还不清楚这些记录是什么样子的。这个问题没有给出要返回的结果集的示例。如果我们想获取两个日期之间的所有记录,那么我们可以从VR t中选择t*,其中t.Date>='2011-01-01'和t.Date<'2016-02-15',但我怀疑考虑到问题中的SQL,这并不是我们真正想要的结果集。请只标记您正在使用的一个数据库,您有mysql和postgres,这是两个不同的数据库。从错误消息中,看起来您实际上正在运行amazon redshift-此数据库有一个特定的标记。编辑该标记以喜欢编写SQL来在EAV模型中处理数据。。。期望的结果到底是什么样的?我们期望得到什么回报?这些属性行是否由id列链接。。。我们是否应该把它看成是像123、'Vlad','Kofman','M','IT',这样的元组行,。。。和234、‘吉姆’、‘克莱默’、‘M’、‘营销’、,。。。456、‘奥林匹亚’、‘杜卡基斯’、‘F’、‘会计’、,。。。然后写一个会返回什么的查询?考虑到坏sql作为规范,我们只是猜测…@spencer7593为了您的理解,我修改了我的问题,实际上我需要获取日期范围为'01-01-2011'到'14-02-2016'之间的所有记录,它与名字和姓氏无关。你能帮我查询一下吗?现在还不清楚这些记录是什么样子的。这个问题没有给出要返回的结果集的示例。如果我们想获取两个日期之间的所有记录,那么我们可以从VR t中选择t*,其中t.Date>='2011-01-01'和t.Date<'2016-02-15',但是我怀疑,考虑到问题中的SQL,这并不是我们所追求的结果集。你能不能也调查一下这个?你能不能也调查一下这个?你能不能也调查一下这个?你能不能也调查一下