这种场景应该如何查询键值对呢?

How should I query key-value pairs in this scenario?

我正在尝试查询 2 个单独的键值对,如下所示: AttributeTable 包含 3 列[感兴趣]

ID       KeyColumn     ValueColumn
12345    Sector        Sector 1
12345    Group         Group X

我需要查询得到以下输出:

ID      Sector     Group
12345   Sector 1   Group X

这是我目前拥有的:

SELECT ID, (SELECT VALUECOLUMN WHERE KEYCOLUMN = 'Sector') as Sector,(SELECT VALUECOLUMN WHERE KEYCOLUMN = 'Group') as Group
FROM AttributeTable 
GROUP BY ID, KEYCOLUMN, VALUECOLUMN

显然,这是错误的,因为它给了我重复项[每个 ID 3 列各 1 行]

我该怎么做才能获得所需的输出?

测试数据

DECLARE @TABLE TABLE (ID INT, KeyColumn VARCHAR(10), ValueColumn VARCHAR(10))
INSERT INTO @TABLE VALUES 
(12345    ,'Sector'    ,    'Sector 1'),
(12345    ,'Group'     ,    'Group X')

查询

SELECT * 
FROM @TABLE
        PIVOT (MAX(ValueColumn)
               FOR KeyColumn
               IN ([Sector] , [Group]))p

结果

╔═══════╦══════════╦═════════╗
║  ID   ║  Sector  ║  Group  ║
╠═══════╬══════════╬═════════╣
║ 12345 ║ Sector 1 ║ Group X ║
╚═══════╩══════════╩═════════╝

如果您需要 PIVOT 的替代方案,我看到的用于实体-属性-值表的视图如下所示:

SELECT DISTINCT
    a.ID
    f1.ValueColumn AS "Sector",
    f2.ValueColumn AS "Group"
FROM AttributeTable a
LEFT JOIN AttributeTable f1 ON f1.ID = a.ID AND f1.KeyColumn = 'Sector'
LEFT JOIN AttributeTable f2 ON f2.ID = a.ID AND f2.KeyColumn = 'Group'

以此类推,每个字段都有一个连接。动态生成它们是一个巨大的痛苦,而 PIVOT 只是稍微好一点,因为它也不是动态的。如果您有理由避免聚合(例如,如果 ValueColumnBIT),这可能会有所帮助。

我认为这会有所帮助。没有枢轴

SELECT a.ID,Max(decode(a.keycolumn,'Group',a.ValueColumn,null))AS "group",
Max(decode(a.keycolumn,'Sector',a.ValueColumn,null))AS "Sector" 
FROM AttributeTable where KeyColumn in ( 'Group','Sector')
Group by a.id;