Je souhaite effectuer une auto-jointure sur une table pour présenter les valeurs par colonne. Pour chaque objet, il existe plusieurs propriétés (jusqu'à une limite connue), mais toutes les propriétés de tous les objets ne sont pas stockées. J'ai essayé plusieurs jointures mais il manque toujours des lignes et je veux des valeurs nulles.
Tableau de départ :
| ID d'objet | Propriétés | Valeur |
|---|---|---|
| 1 | un | 10 |
| 1 | b | 20 |
| 1 | c | 30 |
| 2 | un | 15 |
| 2 | c | 25 |
Mon objectif (en supposant que je sache que les trois propriétés possibles sont a,b,c) est
| ID d'objet | un | b | c |
|---|---|---|---|
| 1 | 10 | 20 | 30 |
| 2 | 15 | 25 |
Vous pouvez utiliser la requête suivante pour y parvenir :
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 ObjectIDDescription :
Utilisez la valeur de
CASE语句,我们选择Attributepour une valeur spécifique, c'est-à-dire "a", "b", etc. Ainsi, pour cette colonne particulière, seule la valeur de cet attribut particulier est sélectionnée.Plusieurs valeurs de ligne utilisant
SUM我们聚合Value字段的值。这样,任何ObjectIDseront regroupées en une seule ligne.Si vous ne souhaitez pas utiliser
SUM因为您可能有非数字值,您可以按照 @xQbert 的建议使用MAXcomme ceci :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