Ich möchte einen Self-Join für eine Tabelle durchführen, um die Werte spaltenweise darzustellen. Für jedes Objekt gibt es mehrere Eigenschaften (bis zu einem bekannten Grenzwert), es werden jedoch nicht alle Eigenschaften für alle Objekte gespeichert. Ich habe verschiedene Verknüpfungen ausprobiert, aber es fehlen immer Zeilen und ich möchte Nullwerte.
Starttisch:
| Objekt-ID | Eigenschaften | Wert |
|---|---|---|
| 1 | eins | 10 |
| 1 | b | 20 |
| 1 | c | 30 |
| 2 | eins | 15 |
| 2 | c | 25 |
Mein Ziel (vorausgesetzt, ich weiß, dass die drei möglichen Eigenschaften a,b,c sind) ist
| Objekt-ID | eins | b | c |
|---|---|---|---|
| 1 | 10 | 20 | 30 |
| 2 | 15 | 25 |
您可以使用以下查询来实现它:
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