Maison > Questions et réponses > le corps du texte
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 |
P粉5634465792024-04-01 09:26:44
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 ObjectID
Description :
Utilisez la valeur de CASE
语句,我们选择 Attribute
pour 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
字段的值。这样,任何 ObjectID
seront regroupées en une seule ligne.
Si vous ne souhaitez pas utiliser SUM
因为您可能有非数字值,您可以按照 @xQbert 的建议使用 MAX
comme 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