我想在表上执行自连接,以按列方式呈现值。对于每个对象,都有多个属性(最多达到已知限制),但并非所有对象的所有属性都被存储。我尝试过各种连接,但总是缺少行,我希望使用空值。
起始表:
| 对象ID | 属性 | 值 |
|---|---|---|
| 1 | 一个 | 10 |
| 1 | b | 20 |
| 1 | c | 30 |
| 2 | 一个 | 15 |
| 2 | c | 25 |
我的目标(假设我知道三个可能的属性是 a,b,c)是
| 对象ID | 一个 | b | c |
|---|---|---|---|
| 1 | 10 | 20 | 30 |
| 2 | 15 | 25 |
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
您可以使用以下查询来实现它:
SELECT ObjectID, SUM(CASE WHEN Attribute = 'a' THEN Value ELSE NULL END) AS a, SUM(CASE WHEN Attribute = 'b' THEN Value ELSE NULL END) AS b, SUM(CASE WHEN Attribute = 'c' THEN Value ELSE NULL END) AS c FROM mytable GROUP BY ObjectID说明:
使用
CASE语句,我们选择Attribute的值作为特定值,即“a”、“b”等。因此,对于该特定列,仅选择该特定属性的值。使用
SUM我们聚合Value字段的值。这样,任何ObjectID的多行值都会聚合到一行中。如果您不愿意使用
SUM因为您可能有非数字值,您可以按照 @xQbert 的建议使用MAX,如下所示:SELECT ObjectID, MAX(CASE WHEN Attribute = 'a' THEN Value ELSE NULL END) AS a, MAX(CASE WHEN Attribute = 'b' THEN Value ELSE NULL END) AS b, MAX(CASE WHEN Attribute = 'c' THEN Value ELSE NULL END) AS c FROM mytable GROUP BY ObjectID